18行代碼3重循環解決最長公共子序列

這個三重循環算是比較複製和難的了,前面我寫了一個和這個類似但比這簡單的二重循環,有興趣的同學可參看:從最長子串問題談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 )

不足之處,懇請指出!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章