最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"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;
}
本文介绍了一种求解最长对称子串的有效算法,并提供了三种不同的实现方法,包括使用Manacher算法、双指针技巧及动态规划的思想,旨在帮助读者理解和掌握最长对称子串问题的解决思路。
798

被折叠的 条评论
为什么被折叠?



