最长回文子串
-
描述
-
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如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>
#include<ctype.h>
int a[5100];
char b[5100],c[5100];
int main()
{
int i,j,sum,len,m,from,to,n,max;
scanf("%d",&n);
getchar();
while(n--)
{
gets(b);
len=strlen(b);
m=0;
max=0;
for(i=0;i<len;i++)
{
if(isalpha(b[i]))
{
a[m]=i;
c[m++]=toupper(b[i]);
}
}
for(i=0;i<m;i++)
{
for(j=0;i-j>=0&&i+j<m;j++)
{
if(c[i-j]!=c[i+j])
break;
if(2*j+1>max)
{
max=2*j+1;
from=a[i-j];
to=a[i+j];
}
}
for(j=0;i-j>=0&&i+j+1<m;j++)
{
if(c[i-j]!=c[i+j+1])
break;
if(2*j+2>max)
{
max=2*j+2;
from=a[i-j];
to=a[i+j+1];
}
}
}
for(i=from;i<=to;i++)
printf("%c",b[i]);
printf("\n");
}
return 0;
}