Given a string S, find the longest palindromic substring in S.
You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
回文子串,顾名思义,即字符串中满足回文性质的子串。比如输入字符串 "google",由于该字符串里最长的对称子字符串是 "goog",因此输出4。
方法一:中心扩展法
这个算法思想其实很简单啊,时间复杂度为O(n^2),空间复杂度仅为O(1)。就是对给定的字符串S,分别以该字符串S中的每一个字符C为中心,采用双指针法left和right,向两边扩展,记录下以字符C为中心的回文子串的长度。但是有一点需要注意的是,回文的情况可能是奇数个字符,如 a b a,也可能是偶数个字符,如 a b b a。此时,首先找出两个相邻元素相等的值,再向两边扩展。
string longestPalindrome(string s)
{
int len=s.size();
if(len==0) return s;
string sub="";
//当对称字符为奇数个时
for(int i=0;i<len;i++)
{
int left=i;
int right=i;
while(left>0&&right<len-1&&s[left-1]==s[right+1])
{
left--;
right++;
}
if(sub.size()<right-left+1)
sub=s.substr(left,right-left+1);
}
//当对称点字符为偶数个时
for(int i=0;i<len-1;++i)
{
if(s[i]==s[i+1])
{
int left=i;
int right=i+1;
while(left>0&&right<len-1&&s[left-1]==s[right+1])
{
left--;
right++;
}
if(sub.size()<right-left+1)
sub=s.substr(left,right-left+1);
}
}
return sub;
}
方法二:Manacher算法
时间复杂度O(N)