最长回文子串
首先可以用fgets读取一行,用辅助字符数组保存字母和在原数组的序号
http://blog.chinaunix.net/uid-22566367-id-381994.html
http://blog.chinaunix.net/uid-21757287-id-327365.html
接下来有几种方法
1.依次遍历中心点,分为奇偶回文子串依次分析
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <cctype> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define debug printf("!\n") #define INF 10000 #define MAXN 5010 #define MAX(a,b) a>b?a:b #define blank pf("\n") #define LL long long char buf[MAXN],s[MAXN],p[MAXN]; int main() { int n,m=0,i,j,mx=0,x,y; fgets(buf,MAXN,stdin); n=strlen(buf); for(i=0;i<n;i++) { if(isalpha(buf[i])) { p[m] = i; s[m++]=toupper(buf[i]); } } for(i=0;i<m;i++) pf("%c",s[i]); blank; for(i=0;i<m;i++) { for(j=0;i-j>=0 && i+j<m;j++) { if(s[i-j]!=s[i+j]) break; if(2*j+1>mx) { mx = 2*j+1; x=p[i-j]; y=p[i+j]; } } for(j=0;i-j>=0 && i+j+1<m;j++) { if(s[i+j+1]!=s[i-j]) break; if(2*j+2>mx) { mx = 2*j+2; x=p[i-j]; y=p[i+j+1]; } } } //pf("tt%d %d %d\n",x,y,mx); for(i=x;i<=y;i++) pf("%c",buf[i]); blank; } /* Confuciuss say:Madam,I'm Adam. */
2.Manacher算法
http://blog.csdn.net/yzl_rex/article/details/7908259
http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <cctype> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define debug printf("!\n") #define INF 10000 #define MAXN 5010 #define MAX(a,b) a>b?a:b #define blank pf("\n") #define LL long long char buf[MAXN],s[2*MAXN],p[MAXN],tmp[MAXN],q[2*MAXN],ans=1; int main() { int n,m=2,i,j,mx=0,x,y,maxid=0,id,mm; mem(q,0); fgets(buf,MAXN,stdin); n=strlen(buf); s[0] = '@'; s[1] = '#'; for(i=0;i<n;i++) { if(isalpha(buf[i])) { q[m] = i; s[m++]=toupper(buf[i]); s[m++] = '#'; } } s[m]=='\0'; for(i=0;i<m;i++) { pf("%c",s[i]); } for(i=0;i<m;i++) { if(maxid>i) p[i] = (p[2*id - i] < (maxid - i) ? p[2*id - i] : (maxid - i)); else p[i] = 1; while(s[i-p[i]]==s[i+p[i]]) p[i]++; if(i+p[i]>maxid) { maxid = i+p[i]; id = i; } if(ans<p[i]) { ans = p[i]; mm = i; } } pf("\np[i]:\n"); for(i=0;i<m;i++) { pf("%d ",p[i]); } blank; x = q[mm-p[mm]+2]; y = q[mm+p[mm]-2]; pf("tt%d %d",x,y); blank; for(i=x;i<=y;i++) pf("%c",buf[i]); blank; } /* RABBATT RABNBATT Confuciuss say:Madam,I'm Adam. */