马拉车算法
#include<bits/stdc++.h>
using namespace std;
string chu(string a)
{
int n=a.length();
string s;
s.resize(n*2+3);
s[0]='$'; //防止数组越界
s[1]='#';
for(int i=1;i<=a.length();i++)
{
s[i*2]=a[i-1];
s[i*2+1]='#';
}
return s;
}
int mala(string a)
{
string s=chu(a);
cout<<s<<endl;
int len[1000],mx=0,malen=-1,mid;
for(int i=1;i<s.length();i++)
{
if(i<mx)
len[i]=min(len[mid*2-i],mx-i);
else
len[i]=1;
while(s[i-len[i]]==s[i+len[i]]) //当i=1时,len[i]=1,
//如果初始化没有用不同字符标记,会越界
len[i]++; //以len[i]作为循环的控制因素
if(i+len[i]>mx)
{
mx=i+len[i];
mid=i;
}
malen=max(malen,len[i]-1);
}
return malen;
}
int main()
{
string a;
cin>>a;
cout<<mala(a);
return 0;
}
朴素算法
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a;
getline(cin,a);
int maxl=0;
for(int i=1;i<a.length()-1;i++)
{
int j=1,len=0;
if(a[i]==a[i+1]) //如果为dfacbbcaj 此时最长回文串为偶数
{
len=1;
while(a[i-j]==a[i+1+j])
{
len++;
j++;
if(i-j<0||i+1+j>=a.length())
break;
}
len*=2;
}
else
{
while(a[i-j]==a[i+j]) //此时最长回文字符串是奇数
{
len++;
j++;
if((i-j)<0||(i+j)>=a.length())
break;
}
len=len*2+1;
}
maxl=max(maxl,len);
}
if(maxl==0&&a.length()==2) //对特殊的2,1个字符,特殊处理
{
if(a[0]==a[1])
cout<<2;
else
cout<<0;
}
else if(a.length()==1)
cout<<1;
else
cout<<maxl;
return 0;
}