字符串最长回文O(n)算法

#include

#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;

}

点赞