最长回文子串
时间限制:
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
#include <stdio.h> #include <string.h> #define MAXN 5005 int main(int argc, char const *argv[]) { char a[MAXN],b[MAXN]; int c[MAXN]; int ncase; scanf("%d%*c",&ncase); while(ncase--) { gets(a); int l,sz = strlen(a),pos = 0,max = 0; for(int i = 0; i < sz; i++) { if('A' <= a[i]&&a[i] <= 'Z'||'a' <= a[i]&&a[i] <= 'z') { c[pos] = i; b[pos++] = a[i] >= 'a'?a[i]-32:a[i]; } } int begin,end; for(int i = 0; i < pos; i++) { for(int j = 0; i-j>=0&&i+j<pos; j++) { if(b[i-j] != b[i+j]) break; if(2*j+1 > max) { max = 2*j+1; begin = c[i-j]; end = c[i+j]; } } for(int j = 0; i-j>=0&&i+j+1<pos; j++) { if(b[i-j] != b[i+j+1]) break; if(2*j+2 > max) { max = 2*j+2; begin = c[i-j]; end = c[i+j+1]; } } } for(int i = begin; i <= end; i++) { printf("%c", a[i]); } printf("\n"); } return 0; }
-
输入一个测试数据n(1<=n<=10);