首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php中LCS函数面临的错误

php中LCS函数面临的错误
EN

Stack Overflow用户
提问于 2014-04-11 02:54:13
回答 2查看 388关注 0票数 0

我使用递归方法在php程序中编写LCS(最长公共子序列)。我有以下代码:

代码语言:javascript
复制
<?php

$lcsTbl = array(array(128),array(128));
$backTracks = array(array(128),array(128));

$str1 = 'asdvadsdad'; 
$str2 = 'asdasdadasda';

$len1 = strlen($str1);
$len2 = strlen($str2); 

echo LCS_Length($lcsTbl, $backTracks, $str1, $str2, $len1, $len2); //longest common sub sequence

echo '<br/>';

function LCS_Length(&$LCS_Length_Table, &$B, &$s1, &$s2, &$m, &$n)
{
  //reset the 2 cols in the table
  for($i=1; $i < $m; $i++) $LCS_Length_Table[$i][0]=0;
  for($j=0; $j < $n; $j++) $LCS_Length_Table[0][$j]=0;

  for ($i=1; $i <= $m; $i++) {
    for ($j=1; $j <= $n; $j++) {
      if ($s1[$i-1]==$s2[$j-1])
        { $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i-1][$j-1] + 1; $B[$i][$j] = '\\';}
      else if ($LCS_Length_Table[$i-1][$j] >= $LCS_Length_Table[$i][$j-1])
        { $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i-1][$j];  $B[$i][$j] = '|';}
      else
        { $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i][$j-1]; $B[$i][$j] = '-';}
    }
  }

  return $LCS_Length_Table[$m][$n];
}

要打印LCS,我调用以下函数:

代码语言:javascript
复制
$x = str_split($str1);
echo lcs_print($backTracks, $str1, $len1, $len2); //print longest common sub sequence


function lcs_print(&$B, &$x, &$i, &$j)
{
    if( $i == 0 || $j == 0 )
        return;
    if( $B[$i][$j] == '\\' ) {
        echo $x[$i-1];
        lcs_print( $B, $x, $i = $i-1, $j = $j-1 );


    } else if( $B[$i][$j] == '|' ) {
        lcs_print( $B, $x, $i = $i-1, $j );
    } else {
        lcs_print( $B, $x, $i, $j = $j-1 );
    }
}
?> 

此代码正确计算LCS的总长度,但在打印函数echo $x[$i-1];中的该行调用中给出“注意:未定义的偏移量:-1”,而不打印任何内容。我已经尝试了几乎所有的方法来拆分$str1字符串,然后将它传递给函数,但是没有什么效果。它不打印LCS字符串,因为这行代码echo $x[$i-1];有问题,我无法得到。请帮帮忙。

注:以上代码的伪码取自托马斯·H·科门的书“算法第三版导论”。我把它写到PHP中,目的是扩展它,以便它可以打印两个以上字符串的LCS。如果有人对我如何扩展这段代码有共同的想法,我会很感激,这样它就可以打印包含多个字符串的数组的LCS,比如$array{'sdsad','asddaw','asd',...n}。稍后,我打算将整个程序转换成MATLAB。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-13 22:13:57

我已经解决了错误:我将echo $x$i-1放在lcs_print( $B,$x,$i = $i-1,$j = $j-1 )之前;在lcs_print函数中,现在一切正常。

票数 0
EN

Stack Overflow用户

发布于 2014-04-11 06:52:21

您的LCS_length中存在一些问题

1.如果($s1$i-1=$s2$j-1),则应该是if ($s1$i==$s2$j)。

2.您的边界条件($j=0;$j < $n)不清楚,您需要包含这个上限,并试图打印它称为lcs_print($backTracks、$str1、$len1、$len2)。它应该是($j=0;$j<=n;$j++)

我认为这些改变会解决问题。我还没有用PHP编写代码,所以不能说语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23002672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档