[i,j]是回文串 若 str[i-1]==str[j+1]则 [i-1,j+1]也是回文串。
#include<stdio.h> #include<iostream> #include<string.h> #include<queue> #include<stack> #include<list> #include<stdlib.h> #include<algorithm> #include<vector> #include<map> #include<set> using namespace std; int Max(int a,int b) { return a>b?a:b; } char str[1111111]; int dp[5555][5555]; int main() { int n; while(~scanf("%d",&n)!=EOF){ for(int k=0;k<n;k++){ int ans=0; scanf("%s",str+1); memset(dp,0,sizeof(dp)); for(int i=1;str[i];i++){ dp[i][i]=1; if(str[i]==str[i+1]) dp[i][i+1]=1; } int len=0; for(int i=1;str[i];i++) len++; for(int i=1;i<=len;i++){ for(int j=1;j+i<=len;j++){ int cc=i+j; if(str[j]==str[cc]) if(dp[j+1][cc-1]) dp[j][cc]=1; if(dp[j][cc]) ans=Max(ans,i+1); // printf("%d %d %d",i,i+j,dp[i][j+i]);system("pause"); } } printf("%d\n",ans); } } return 0; }
从中间向两边跑
#include<stdio.h> #include<iostream> #include<string.h> #include<queue> #include<stack> #include<list> #include<stdlib.h> #include<algorithm> #include<vector> #include<map> #include<set> #include <fstream> using namespace std; string expand(string s1,int a,int b) { int l=a;int r=b; int len=s1.length(); while(l>=0&&r<len&&s1[l]==s1[r]){ l--;r++; } return s1.substr(l+1,r-l-1); } string Max(string a,string b) { if(a.length()>b.length()) return a; else return b; } string str; int main() { int n; while(scanf("%d",&n)!=EOF){ for(int k=0;k<n;k++){ cin>>str; string longest = str.substr(0,1); int len=str.length(); for(int i=0;i<len;i++){ longest=Max(longest,expand(str,i,i)); // printf("%d ",i); // cout<<longest<<endl; // system("pause"); } for(int i=0;i<len;i++){ if(str[i]==str[i+1]) longest=Max(longest,expand(str,i,i+1)); } printf("%d\n",longest.length()); } } return 0; }
O(n)的算法。
#include<stdio.h> #include<iostream> #include<string.h> #include<queue> #include<stack> #include<list> #include<stdlib.h> #include<algorithm> #include<vector> #include<map> #include<set> #include <fstream> using namespace std; int Min(int a,int b) { return a>b?b:a; } int p[1111111]; char str[1111111],s1[1111111]; int len; void pk() { int mx=0;int id; for(int i=1;i<len;i++){ if(mx>i){ p[i]=Min(p[id*2-i],mx-i); } else p[i]=1; for(;s1[i-p[i]]==s1[i+p[i]];p[i]++); if(p[i]+i>mx){ mx=p[i]+i; id=i; } } } int main() { int n; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ scanf("%s",str); s1[0]=‘.‘; s1[1]=‘#‘; len=strlen(str); for(int j=0;j<len;j++){ s1[2*j+2]=str[j]; s1[2*j+3]=‘#‘; } len=len*2+1; int ans=0; pk(); for(int i=1;i<len;i++) if(ans<p[i]) ans=p[i]; printf("%d\n",ans-1); } } return 0; }
原文地址:http://www.cnblogs.com/yigexigua/p/3845169.html