一开始n^2的写法,超时
class Solution {
public:
void init(string s,int& maxn,int &sta)
{
int n=s.size();
vector<vector<bool>> dp(n,vector<bool>(n));
int i,j;
for(i=n-1;i>=0;i--)
{
dp[i][i]=1;
for(j=i+1;j<n;j++)
{
if(s[i]!=s[j])
{
dp[i][j]=0;
continue;
}
if(j==i+1)
dp[i][j]=1;
else
dp[i][j]=dp[i+1][j-1];
if(dp[i][j]==1&&maxn<j-i+1)
{
maxn=j-i+1;
sta=i;
}
}
}
}
string longestPalindrome(string s) {
int n=s.size();
if(n==0)
return s;
int maxn=1;
int i,j;
int sta=0;
init(s,maxn,sta);
return s.substr(sta,maxn);
}
};
方法2:采用从中心向两边扩充,也是O(n^2)算法,竟然过了
class Solution {
public:
string GetP(string s,int left,int right)
{
int n=s.size();
while(left>=0&&right<n&&s[left]==s[right])
{
left--;
right++;
}
return s.substr(left+1,right-left-1);
}
string longestPalindrome(string s) {
int n=s.size();
int i;
string x,y;
string tmp=s.substr(0,1);
for(i=0;i<n-1;i++)
{
x=GetP(s,i,i);
if(x.size()>tmp.size())
tmp=x;
y=GetP(s,i,i+1);
if(y.size()>tmp.size())
tmp=y;
}
return tmp ;
}
};
方法3:
使用mancher算法,复杂度是O(n),
class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
int i;
int mx=0;
if(n==0)
return s;
string str="$";
for(i=0;i<n;i++)
{
str+="#";
str+=s[i];
}
str+="#0";
int len=str.size();
int p[len]={0};
int id=0;
int maxn=0,sta=0;
for(i=1;i<len-1;i++)
{
if(mx>i)
p[i]=min(mx-i,p[2*id-i]);
else
p[i]=1;
while(str[i-p[i]]==str[i+p[i]])
p[i]++;
if(p[i]+i>mx)
{
mx=i+p[i];
id=i;
}
if(maxn<p[i]-1)
{
maxn=p[i]-1;
sta=i;
}
}
string tmp="";
for(i=sta-p[sta]+1;i<sta+p[sta];i++)
{
if(str[i]!='#')
tmp+=str[i];
}
return tmp;
}
};