最长回文子串

首先可以用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("!
")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("
")
#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
",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("!
")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("
")
#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]=='';
     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("
p[i]:
");
     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.
*/
原文地址:https://www.cnblogs.com/qlky/p/5167870.html