향에 오류가 LCS 기능 php
-
20-12-2019 - |
문제
나는 코딩 LCS(장 일반적인 시퀀스)에서 php 를 사용하여 프로그램을 재귀적인 접근 방식이다.나는 다음과 같은 코드:
<?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 );
}
}
?>
이 코드를 수은 총 lengthof LCS 올바르지만"주의 사항:정의되지 않은 오프셋:-1"모든 호출에는 이 라인에서 프린트 기능 echo $x[$i-1];
고 인쇄합니다.가 거의 모든 분할하의 문자열$str1 한 다음 전달하는 기능을 하지만 아무것도 작동하지 않습니다.인쇄되지 않습 LCS 문자열이기 때문에 뭔가 잘못으로 이 줄의 코드 echo $x[$i-1];
내가 못 얻을 수 있습니다.도와 주시기 바랍니다.
참고:서 의사의 위 코드에서 촬영되었습의 책 Thomas H.Cormen,"소개하는 알고리즘 3rd Edition".쓰고 그것으로 PHP 의 의도와 함께 연장 그래서 그것을 인쇄할 수 있습니다 LCS 의 두 개 이상의 문자열입니다.나는 감사하는 경우에는 사람의 주가의 아이디어는 방법을 연장할 수 있 이 코드는 그것을 인쇄할 수 있습니다 LCS 의 배열과 여러 문자열은 다음과 같$배열{'sdsad','asddaw','asd',n}.나중에,내가 의도하는 변환 프로그램 전체로 MATLAB.
해결책 2
나는 해결 오류가 발생합니다.나는 배치 echo$x[$i-1];전 lcs_print($B,$x,$i=$i-1,$j=$j-1);에 lcs_print 기능 모든 수 있다는 것을 의미합니다..
다른 팁
문제가 있에서 당신의 LCS_length
1.if($s1[$i-1]==$s2[$j-1]),그것이 있어야 되는 경우($s1[$i]==$s2[$j])
2.당신의 경계 조건($j=0;$j < $n)은 불분명하여야 하며,이 upperbound
당신은 노력하고 그것을 인쇄하이 lcs_print($역 추적,$str1,$len1,$len2).야($j=0;$j<=n;$j++)
내 생각에 이러한 변경은 문제가 해결 될 수 있습니다.수행하지 않았 코딩 PHP 에서 그렇게 말할 수 없습에 대한 구문.