最长回文字符串
来源:互联网 发布:数据存储的方式 编辑:程序博客网 时间:2024/05/21 18:32
最长回文子串
时间限制:1000 ms | 内存限制:65535 KB
难度:4
- 描述
- 输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
- 输入
- 输入一个测试数据n(1<=n<=10);
随后有n行,每行有一个字符串。 - 输出
- 输出所要求的回文子串。
- 样例输入
1Confuciuss say:Madam,I'm Adam.
- 样例输出
Madam,I'm Adam
代码:
#include<stdio.h>#include<string.h> #define MAX 5010 int main() { int t,i,j,st,len,end,k,max; int pos[MAX]; char s[MAX],s1[MAX]; scanf("%d",&t); getchar(); while(t--) { gets(s); len=strlen(s); k=st=max=end=0; for(i=0;i<len;++i) { if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z') { pos[k]=i; if(s[i]<97) s1[k++]=s[i]+32; else s1[k++]=s[i]; } } for(i=0;i<k;++i)//奇数 { for(j=0;j<=i&&i+j<k;++j) { if(s1[i-j]!=s1[i+j]) break; if(j*2+1>max) { max=2*j+1; st=pos[i-j]; end=pos[i+j]; } } for(j=0;j<=i&&i+j+1<k;++j) //偶数 { if(s1[i-j]!=s1[i+j+1]) break; if(j*2+2>max) { max=2*j+2; st=pos[i-j]; end=pos[i+j+1]; } } } for(i=st;i<=end;++i) printf("%c",s[i]); printf("\n"); } return 0; }
ps: 说下这个题的处理思路 第一呢 就是字母全部提出来并且将大写转换为小写 当然反之亦然 第二个呢 就是要考虑到奇数回文字符串和偶数回文的区别 然后就是利用循环 暴力的搜出最大的解 输出就可以了。
0 0
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 字符串最长回文串
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 最长的回文字符串
- 最长回文子字符串
- 求解最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串Manacher
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 最长回文子字符串
- [Java基础笔记]读写部分
- 表达式
- poj 2506Tiling
- Nutz logoJava应用框架 Nutz
- JSP里ContentType ,charset和pageEncoding的理解与区别
- 最长回文字符串
- 递归方式查找文件夹的所有文件
- 快10点了,天黑了,我睡了。。。
- Can not perform this action after onSaveInstanceState
- C++ 类的静态成员详细讲解
- lintcode coins-in-a-line-ii 硬币排成线ii
- string 分割字符串
- pclint之检查多个代码文件和库头文件
- HDU5752 Sqrt Bo