最长回文子串
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
-
输入
-
输入一个测试数据n(1<=n<=10);
随后有n行,每行有一个字符串。
输出
- 输出所要求的回文子串。 样例输入
-
1 Confuciuss say:Madam,I'm Adam.
样例输出
-
Madam,I'm Adam
-
输入一个测试数据n(1<=n<=10);
代码:
#include<stdio.h>
#include<string.h>
#define MAX 5010
int main()
{
int t,i,j,st,len,end,k,max;
int pos[MAX];
char s[MAX],s1[MAX];
scanf("%d",&t);
getchar();
while(t--)
{
gets(s);
len=strlen(s);
k=st=max=end=0;
for(i=0;i<len;++i)
{
if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z')
{
pos[k]=i;
if(s[i]<97)
s1[k++]=s[i]+32;
else
s1[k++]=s[i];
}
}
for(i=0;i<k;++i)//奇数
{
for(j=0;j<=i&&i+j<k;++j)
{
if(s1[i-j]!=s1[i+j])
break;
if(j*2+1>max)
{
max=2*j+1;
st=pos[i-j];
end=pos[i+j];
}
}
for(j=0;j<=i&&i+j+1<k;++j) //偶数
{
if(s1[i-j]!=s1[i+j+1])
break;
if(j*2+2>max)
{
max=2*j+2;
st=pos[i-j];
end=pos[i+j+1];
}
}
}
for(i=st;i<=end;++i)
printf("%c",s[i]);
printf("\n");
}
return 0;
}
ps: 说下这个题的处理思路 第一呢 就是字母全部提出来并且将大写转换为小写 当然反之亦然 第二个呢 就是要考虑到奇数回文字符串和偶数回文的区别 然后就是利用循环 暴力的搜出最大的解 输出就可以了。