(1)最长公共子序列
说明:假如有一个字符串是abcde。那么他的子序列包括a,ab,bc,ad,abc,abe等等(这个不一定非要连续,只要每个字符取自该字符串并且保持前后顺序就可以)。现在给定两个字符串cnblogs,belong,他们的公共的序列包括bl,bo等等,求其最长的子序列
思路:其最长的子序列是blog。先理解一下书上的给的几个结论:
最后的总结很重要,逻辑就是根据这个来的。
代码:
1 <?php 2 $str1 = 'cnblogs'; 3 $str2 = 'belong'; 4 function findStr($str1, $str2) 5 { 6 if ($str1 == '' || $str2 == '') //i=0或j=0 7 return ''; 8 9 while ($str1 != '' && $str2 != '') 10 { 11 if ($str1[strlen($str1) - 1] == $str2[strlen($str2) - 1]) { //X(i) = Y(j) 12 $res = substr($str1, -1) . $res; 13 list($str1, $str2) = [substr($str1, 0, -1), substr($str2, 0, -1)]; 14 } else { //X(i) != Y(j) 15 list($r1, $r2) = [findStr(substr($str1, 0, -1), $str2), findStr($str1, substr($str2, 0, -1))]; 16 $res = strlen($r1) > strlen($r2) ? $r1 . $res : $r2 . $res; //取max 17 break; 18 } 19 } 20 return $res; 21 } 22 echo findStr($str1, $str2);