给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
这道题在网上看到了许多解法,如动态规划,马拉车解法,看得一知半解,最后找到一个求最长子串长度的解法,在它的基础上得到了如下通俗解法,时间复杂度为O(N^2)
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length();
if(n < 1) return "";
int count=0, maxLen=0;
for(int i=0;i<n;i++)
{
for(int j=0;(i-j)>=0&&(i+j)<n;j++) //当子串长度为奇数时
{
if(s[i-j] != s[i+j])
break;
count = 2 * j + 1;
if(count > maxLen)
maxLen = count;
}
for(int k=0;(i-k)>=0&&(i+k+1)<n;k++) //当子串长度为偶数时
{
if(s[i-k] != s[i+k+1])
break;
count = 2 * k + 2;
if(count > maxLen)
maxLen = count; //到此步得到了原字符串的最长子串的长度maxLen
}
}
for(int i=0;i<=n-maxLen;i++) //从原数组截取maxLen长度的子串,为回文就返回
{
string longestSubstr = s.substr(i,maxLen);
if(ishuiwen(longestSubstr))
return longestSubstr;
}
}
bool ishuiwen(string s) //判断字符串是否为回文
{
if(s.length()<2)
return true;
int n = s.length();
for(int i=0;i<n/2;i++)
if(s[i] != s[n-i-1])
return false;
return true;
}
};
思路:循环原字符串,以每一个字符为中点向左右遍历,得到最长子回文串的长度maxLen(注意子串长度的奇偶),然后截取maxLen长度的子串判断是否为回文即可.