南邮 OJ 1100 最长回文子串

来源:互联网 发布:windows caffe mnist 编辑:程序博客网 时间:2024/05/16 12:42

最长回文子串

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 748            测试通过 : 242 

比赛描述

输入一个字符串,求出其中最大的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。


输入

输入字符串长度不超过5000,且占据单独的一行。

输出

输出最长的回文串,如果有多个,输出起始位置最靠左的。

样例输入

Confuciuss say: Madam,I?m Adam.

样例输出

Madam, I?m Adam

题目来源

刘汝佳《算法竞赛入门经典》





#include<iostream>#include<string>#define MAX_N 5010using namespace std;int main(){int i,j,b,e,n,m,max;int pos[MAX_N];string str1,str2;getline(cin,str1);n = (int)str1.length();str2.resize(n);for(i=0,m=0; i<n; ++i){if(str1[i]>='a' && str1[i]<='z'){pos[m]=i;str2[m++]=str1[i];}else if(str1[i]>='A' && str1[i]<='Z'){pos[m]=i;str2[m++]=str1[i]-'A'+'a';}}b = 0;e = 0;max = 1;for(i=1;i<m;i++){for(j=1; i-j>=0 && i+j<m && str2[i+j]==str2[i-j]; j++);j--;if(max<2*j+1){max=2*j+1;b=i-j;e=i+j;}for(j=1; i-j>=0 && i-1+j<m && str2[i-j]==str2[i-1+j]; j++);j--;if(max<2*j){max=2*j;b=i-j;e=i-1+j;}}str1=str1.substr(pos[b],pos[e]-pos[b]+1);cout<<str1<<endl;}


0 0
原创粉丝点击