#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
int i=0,j=0;
char *ch=new char[2*str.size()];
int *p=new int[2*str.size()];
int maxi,max;
ch[j++]=str[i++];
while(i<str.size()){
ch[j++]='#';
ch[j++]=str[i++];
}
ch[j]='\0';
//cout<<ch<<endl;
i=0;
maxi=i;
max=i;
p[i++]=0;
//cout<<" ";
while(i<j){
if(maxi+p[maxi]<=i){ //当i在最大半径之外(上),从0开始扩
int k=1;
p[i]=0;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
else{
if(maxi+p[maxi]-i==p[2*maxi-i]){ //当i在最大半径之内,且到最大半径边界的距离等于对称点的扩展半径
p[i]=p[2*maxi-i];
int k=p[i]+1;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}//cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
else if(maxi+p[maxi]-i>p[2*maxi-i]){ //当i在最大半径之内,且到最大半径边界的距离大于对称点的扩展半径
p[i]=p[2*maxi-i];//cout<<p[i];
}
else{ //当i在最大半径之内,且到最大半径边界的距离小于对称点的扩展半径
p[i]=maxi+p[maxi]-i;
int k=p[i]+1;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}//cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
}
++i;
}
if(ch[max-p[max]]!='#')
cout<<p[max]+1<<endl;
else
cout<<p[max]<<endl;
delete[] ch;
delete[] p;
}
else{
cout<<0<<endl;
}
}
return 0;
}
#include<string>
using namespace std;
int main(){
string str;
while(cin>>str){
if(str.size()!=0){int i=0,j=0;
char *ch=new char[2*str.size()];
int *p=new int[2*str.size()];
int maxi,max;
ch[j++]=str[i++];
while(i<str.size()){
ch[j++]='#';
ch[j++]=str[i++];
}
ch[j]='\0';
//cout<<ch<<endl;
i=0;
maxi=i;
max=i;
p[i++]=0;
//cout<<" ";
while(i<j){
if(maxi+p[maxi]<=i){ //当i在最大半径之外(上),从0开始扩
int k=1;
p[i]=0;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
else{
if(maxi+p[maxi]-i==p[2*maxi-i]){ //当i在最大半径之内,且到最大半径边界的距离等于对称点的扩展半径
p[i]=p[2*maxi-i];
int k=p[i]+1;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}//cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
else if(maxi+p[maxi]-i>p[2*maxi-i]){ //当i在最大半径之内,且到最大半径边界的距离大于对称点的扩展半径
p[i]=p[2*maxi-i];//cout<<p[i];
}
else{ //当i在最大半径之内,且到最大半径边界的距离小于对称点的扩展半径
p[i]=maxi+p[maxi]-i;
int k=p[i]+1;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}//cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
}
++i;
}
if(ch[max-p[max]]!='#')
cout<<p[max]+1<<endl;
else
cout<<p[max]<<endl;
delete[] ch;
delete[] p;
}
else{
cout<<0<<endl;
}
}
return 0;
}
本文介绍了一种用于寻找输入字符串中最长回文子串的高效算法实现。通过使用动态规划的思想并结合中心扩展法,该算法能够在O(n)的时间复杂度内找到给定字符串中的最长回文子串。此外,还详细展示了算法的具体步骤和实现过程。
算法&spm=1001.2101.3001.5002&articleId=50975707&d=1&t=3&u=a4ba255295b24b7eb27260f0486bd09c)
3万+

被折叠的 条评论
为什么被折叠?



