最长回文子串
时间限制: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
伪代码如下,大家自己调试下,参考ACM程序设计原书!
01 | #include <stdio.h> |
02 | #include <string> |
03 | #include <string.h> |
04 | #include <ctype.h> |
05 | #define MAXN 5000+10 |
06 | char buf[MAXN],s[MAXN]; //buf为输入的字符串,s为忽略标点的字符串 |
07 | int p[MAXN]; //p数组记录新数组在原数组中的坐标 |
08 | int main() |
09 | { |
10 | int n,m,max,x,y; |
11 | int i,j,t; |
12 | scanf ( "%d" ,&t); |
13 | while (t--) |
14 | { |
15 | m=max=0; |
16 | fgets (buf, sizeof (s),stdin); //==string->getline(); |
17 | printf ( "abcdefgn" ); |
18 | n= strlen (buf); |
19 | for (i=0;i<n;i++) |
20 | if ( isalpha (buf[i])) //处理字符串 |
21 | { |
22 | p[m]=i; //记录下标 |
23 | s[m++]= toupper (buf[i]); |
24 | } |
25 | for (i=0;i<m;i++) |
26 | { |
27 | for (j=0;i-j>=0&&i+j<m;j++) |
28 | { |
29 | if (s[i-j]!=s[i+j]) break ; |
30 | if (j*2+1>max) {max=j*2+1;x=p[i-j];y=p[i+j];} |
31 | } |
32 | for (j=0;i-j>=0&&i+j+1<m;j++) |
33 | { |
34 | if (s[i-j]!=s[i+j+1]) break ; |
35 | if (j*2+2>max) {max=j*2+2;x=p[i-j];y=p[i+j+1];} |
36 | } |
37 | } |
38 | for (i=x;i<=y;i++) |
39 | printf ( "%c" ,buf[i]); |
40 | printf ( "n" ); |
41 | } |
42 | return 0; |
43 | } |
44 | //算法参考程序设计原书 |
原创文章,转载请注明: 转载自C/C++程序员之家
本文链接地址: 最长回文子串