http://acm.nyist.net/JudgeOnline/problem.php?pid=132
最长回文子串
时间限制:
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<iostream> #include<cctype> #include<cstring> #include<cstdio> using namespace std; int const MAX = 5000 + 10; char buf[MAX], s[MAX]; int p[MAX]; int main() { int T; cin >> T; getchar(); while (T--) { int m = 0, n, max = 0; int x, y; gets(buf); n = strlen(buf); for (int i = 0; i < n; i++) { if (isalpha(buf[i])) {//判断是否为字母 p[m] = i; // 保存s[i]在buf中的位置 s[m++] = toupper(buf[i]); //返回大写字母 } } for (int i = 0; i < m; i++) { for (int j = 0; i - j >= 0 && i + j < m; j++) { //最长回文串的长度是奇数 if (s[i - j] != s[i + j]) break; //向s[i]的两边扩展。i-j,i+j用的好啊 if (2 * j + 1 > max) { //更新max 同时记录s[i]在buf中的位置 max = 2 * j + 1; x = p[i - j]; y = p[i + j]; } } for (int j = 0; i - j >= 0 && i + j + 1 < m; j++) { //最长回文数的长度是偶数 if (s[i - j] != s[i + j + 1]) break; if (2 * j + 2 > max) { //更新max 同时记录s[i]在buf中的位置 max = 2 * j + 2; x = p[i - j]; y = p[i + j + 1]; //偶数要向后加个 } } } for (int i = x; i <= y; i++) cout << buf[i]; cout << endl; } }
-
输入一个测试数据n(1<=n<=10);