最长回文子串——4种解法
参考地址: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); } }
不积跬步,无以至千里;