Longest Palindromic Substring
Description:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: “babad”
Output: “bab”
Note: “aba” is also a valid answer.
Example:
Input: “cbbd”
Output: “bb”
解题思路:
首先想到两种方法都是枚举思想,第一种是对于每个子串的中心往两边扫,不断更新最长回文串;第二种是动态规划,通过维护一个二维bool数组,遍历所有字符,进行判断。
第一种中心有2*n-1个,字符有n个,间隙有n-1个。
class Solution {
public:
string longestPalindrome(string s) {
if(s.empty())
return "";
int left=0;
int right=0;
int maxlen=0;
string res,str;
for(int i=0;i<2*s.length()-1;i++)
{
left=i/2;
right=i/2;
if(i%2==1)
right++;
str=longest(left,right,s);
if(maxlen<str.length())
{
maxlen=str.length();
res=str;
}
}
return res;
}
private:
string longest(int left,int right,string s)
{
while(s[left]==s[right]&&left>=0&&right<=s.length())
{
left--;
right++;
}
return s.substr(left+1,right-left-1);
}
};
第二种方法中
if(s.charAt(i)==s.charAt(j) && (j-i<=2 || palin[i+1][j-1])) 是核心,不断更新palin[i][j],如果palin[i+1][j-1]是true那么对它的外层进行判断;j-i<=2说明它要么是以一个字符或者间隙为核心的回文串,要么是单个的字符或间隙。
class Solution {
public:
string longestPalindrome(string s) {
if(s.empty())
return "";
string res="";
int maxlen=0;
bool judge[s.length()][s.length()]={0};
for(int i=0;i<s.length();i++)
{
for(int j=i;j>=0;j--)
{
if(s[i]==s[j]&&(i-j<=2||judge[j+1][i-1]))
{
judge[j][i]=true;
if(i-j+1>maxlen)
{
maxlen=i-j+1;
res=s.substr(j,i-j+1);
}
}
}
}
return res;
}
};
以上复杂度都是O(n^2),还有一种Manacher’s Algorithm很厉害,能够做到线性,这个比较复杂,有兴趣的同学可以自行查阅