给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
数据范围1e3,用时间复杂度的
O
(
n
2
)
O(n^2)
O(n2)的中点扩散即可
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int res=0,x,y;
int n=(int)s.length();
string str;
for(int i=0;i<n;i++)
{
int l=i-1,r=i+1;
while(l>-1&&r<n&&s[l]==s[r]) l--,r++;
if(r-l-1>res)
{
res=r-l-1;
x=l+1;
y=r-1;
}
l=i,r=i+1;
while(l>-1&&r<n&&s[l]==s[r]) l--,r++;
if(r-l-1>res)
{
res=r-l-1;
x=l+1;
y=r-1;
}
}
for(int i=x;i<=y;i++) str+=s[i];
return str;
}
};
Manacher代码
class Solution {
public:
int countSubstrings(string s) {
if(!s.length()) return 0;
int n=(int)s.length()*2+1;
char *str=new char[n];
int *p=new int[n];
int c,r,index,res;
c=r=-1;
index=res=0;
for(int i=0;i<n;i++) str[i]=(i&1)?s[index++]:'#';
for(int i=0;i<n;i++)
{
p[i]=r>i?min(r-i,p[2*c-i]):1;
while(i+p[i]<n&&i-p[i]>-1)
{
if(str[i+p[i]]==str[i-p[i]]) p[i]++;
else break;
}
if(i+p[i]>r)
{
r=i+p[i];
c=i;
}
}
for(int i=0;i<n;i++)
{
if(i&1) res+=(p[i]-1)/2+1;
else res+=(p[i]-1)/2;
}
delete[] str;
delete[] p;
return res;
}
};