参考地址:https://www.cnblogs.com/leoin2012/p/3984997.html
题记:
最近刚研究了动态规划,感觉确实是算法思想中比较晦涩深奥的一种,解法2就是用动态规划,一般都是用数组记录尝试过的解法结果,为后续的解法提供剪枝。对于这道题目,解法1,解法3的思路比较简单易懂。
解法1:用两个for循环找出所有子串,第三个for循环用于判断该子串是否为回文,是回文则且比已找到的回文串长就替换,算法时间效率为O(n^3)
解法3:用for循环遍历字符串的每一个字符,每找到一个字符就以此为中心,往两边拓展,看左右字符串是否相等。但是回文有两种类型,一种为奇数,一种偶数,如下:
奇数回文:aba
偶数回文:abba
所以要分成2种情况。算法时间效率为O(n^2)
原文:
之前注册过hihoCoder,现在看到推出编程字符串专题,有这个题目,自己写一下。
回文是指正着读和倒着读,结果一些样,比如abcba或abba。
题目是要在一个字符串中要到最长的回文子串。
1、暴力法
最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个。
求每一个子串时间复杂度O(N^2),判断子串是不是回文O(N),两者是相乘关系,所以时间复杂度为O(N^3)。
/**
* @param String $s
* @return String
*/
function longestPalindrome($s) {
$length = strlen($s);
$maxlength = 0;
$start = 0;
if($length<=1){
return $s;
}
for($i=0;$i<$length;$i++){
for($j=$i+1;$j<$length;$j++){
$tmp1 = 0;
$tmp2 = 0;
for($tmp1=$i,$tmp2=$j;$tmp1<$tmp2;$tmp1++,$tmp2--){
if($s[$tmp1]!=$s[$tmp2]){
break;
}
}
if($tmp1>=$tmp2 && $j-$i>=$maxlength){
$maxlength = $j-$i+1;
$start = $i;
}
}
}
if($maxlength>0){
return substr($s,$start,$maxlength);
}else{
return substr($s,0,1);
}
}