最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:Is PAT&TAP symmetric?输出样例:
11
//方法一:最大回文数思想模板
#include <cstdio> #include <cstring> #include <iostream> using namespace std;
int n,i,p[2000005];
char str[1000005],s[2000005];
int Manacher(char *ch)
{
s[0]=1;//第一个字符不同,防止越界
s[1]=2;
char *t=s+2;
while(*ch)
{
*(t++)=*(ch++);
*(t++)=2;
}
*(t++)='\0';
int max1=0,j=0;
p[0]=0;
for(int i=2;s[i];++i)
{
p[i]=(p[j]+j>i?min(p[(j<<1)-i],p[j]+j-i):1);
while(s[i-p[i]]==s[i+p[i]])
++p[i];
if(p[j]+j<p[i]+i)
j=i;
if(max1<p[j])
max1=p[j];
}
return max1-1;
}
int main()
{
while(gets(str))
{
printf("%d\n",Manacher(str));
break;
}
return 0;
}
//方法二:
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char a[10005]; //字符串的储存 int b[10005]; //第一种方法 int c[10005]; //第二种方法 int main() { int n,m,i,j; gets(a); int len = strlen(a); for(i = 0;i < 10005; i++) { b[i] = 1; //初始化为1;; } for(i = 0;i < 10005; i++) { c[i] = 0; //初始化为0;; } for(i = 1;i < len; i++) { for(j = 1;j <= i; j++) //从字符的两边开始查那就把j的开始为1;; { if(a[i+j] == a[i-j]) //如果相同 b[i] = b[i]+2; //那这个地方所配对的b加2;; else break; //如果不相同直接跳出 } } for(i = 1;i < len; i++) { for(j = 0;j <= i; j++) //从空隙的两边开始查那就把j的开始为0;; { if(a[i+j+1] == a[i-j]) //这就是关键要正好为空隙的两边 c[i] = c[i]+2; //相同加2 else break; } } int max = 0; for(i = 0;i < len;i++) //找出最大的,, { if(max < b[i]) max = b[i]; if(max < c[i]) max = c[i]; } printf("%d\n",max); return 0; }
//方法三:
#include <stdlib.h> #include <stdio.h> #include <string.h> int FUN(char *inp)//求最大对称子串长度 { int maxlen = 1;//最大长度 int len=strlen(inp);//字符串长度 int record[len];//存包含该位及前个元素最长对称子串 record[0]=1; int i; for(i=1;i<len;i++) { int max =1; if((i-record[i-1]-1)>=0 && inp[i] == inp[i-record[i-1]-1]) { max = max>(record[i-1] + 2)? max:(record[i-1] +2); } int k = 1; while(inp[i] == inp[i-k]) { k++; } max = max>k? max:k; record[i] = max; //printf("----- is:%d\n",record[i]); if(record[i]>maxlen) { maxlen=record[i]; } } return maxlen; } int main() { char *input="abadddkeipdldlfk"; int retlen = FUN(input);//从前向后递归 printf("max length is:%d\n",retlen); return 0; }