這個三重循環算是比較複製和難的了,前面我寫了一個和這個類似但比這簡單的二重循環,有興趣的同學可參看:從最長子串問題談continue的使用。
說實話,網上的看的懂,但好像寫不出2333....
所以我就以自己的理解,如果有錯誤的地方,歡迎指出。
首先,我們有兩個字符串abcde和cdabe,很容易看出,最長公共子串是abe和cde。
首先,第一個字符串ab匹配到第二個的ab後,第一個ab後面的c和和第二個ab後面的e不匹配,此時,第二個字符串也到最後一個字符e了。回到第一個字符,因爲我們已經知道c不匹配,並且我們知道我們已經匹配到了第二個字符串的ab,此時運用動態規劃,只需匹配第一個字符串c後面的de和第二個字符串ab後面的e。此時,我們就能匹配出abe了。
然後,第一個字符a這樣子就算匹配完了。依次對第一個字符a後面的bcde重複運用上面的步驟,就能全部求解出來了。
<?php
$a='abcde';
$b='cdabe';
$str='';
for($l=0;$l<strlen($a);$l++){
$k=$l;
$n=0;
$d[]=$str;
$str='';
for($i=&$k;$i<strlen($a);$k++){
for($j=$n;$j<strlen($b);$j++){
if($k<strlen($a) && $a[$k]==$b[$j]){
$str.=$a[$k];
$k++;
$n=$j+1;
}
}
}
}
print_r($d);
結果如下
Array ( [0] => [1] => abe [2] => be [3] => cde [4] => de )
不足之處,懇請指出!