最长回文子串
时间限制:
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
-
AC代码:
-
#include<iostream> using namespace std; #include<string.h> #include<stdio.h> #include<ctype.h> int main() { char a[5005],b[5005],e[5005]; int n,l,k1,k2,max,b1,b2,i,j,c; cin>>n; getchar(); //吸收空格 while(n--) { gets(a); l=strlen(a); for(i=0,j=0;i<l;i++) if(isalpha(a[i])) //判断是否为字母 { e[j]=i; //记录改变过后字符串中每个字符原来的位置 b[j++]=tolower(a[i]);//如果 b[j]是字母的话, 则将之变为小写字母,toupper(a[i])是将之变为大写 ,加上头文件#include<ctype.h> c=j; } // for(i=0;i<c;i++)cout<<b[i]; //cout<<"pppppppp"<<endl; for(i=0,b1=0,b2=0,max=0;i<c;i++) //求字符串中最长的子字符串 for(j=i;j<c;j++) { if(b[j]==b[i]) { for(k1=i,k2=j;k1<(i+j)/2;k1++,k2--) if(b[k1]!=b[k2])break; if(b[k1]==b[k2]&&k1>=(i+j)/2) { if((j-i+1)>max) { max=j-i+1; b1=i; b2=j; } } } } //求最长的子字符串 for(i=e[b1];i<=e[b2];i++) //输出原来的字符串 cout<<a[i]; cout<<endl; }
-
return 0; }
-
输入一个测试数据n(1<=n<=10);