当前位置: 代码迷 >> 综合 >> NYOJ - 最长回文子串
  详细解决方案

NYOJ - 最长回文子串

热度:55   发布时间:2024-01-20 17:54:32.0

最长回文子串

时间限制: 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 5005int 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;
}

  相关解决方案