南邮 OJ 1100 最长回文子串

最长回文子串

时间限制(普通/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 5010
using 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;
}


你可能感兴趣的:(ACM,最长回文子串,南邮OJ)