我使用递归方法在php程序中编写LCS(最长公共子序列)。我有以下代码:
<?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,我调用以下函数:
$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。
发布于 2014-04-13 22:13:57
我已经解决了错误:我将echo $x$i-1放在lcs_print( $B,$x,$i = $i-1,$j = $j-1 )之前;在lcs_print函数中,现在一切正常。
发布于 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编写代码,所以不能说语法。
https://stackoverflow.com/questions/23002672
复制相似问题