天天看點

南郵 OJ 1968 最長回文子串的長度

最長回文子串的長度

時間限制(普通/Java) :  1000 MS/ 3000 MS          運作記憶體限制 : 65536 KByte

總送出 : 391            測試通過 : 84 

比賽描述

輸入一個字元串,求出其中最大回文子串的長度。子串的含義是:在原串中連續出現的字元串片段。回文的含義是:正着看和倒着看相同,如abba和yyxyy。在判斷時,應該忽略所有标點符号和空格,且忽略大小寫,但輸出應保持原樣(在回文串的首部和尾部不要輸出多餘字元)。

輸入

輸入字元串長度不超過5000,且占據單獨的一行。

輸出

輸出最長回文串的長度,該回文串不包括所有标點符号和空格。

樣例輸入

Confuciuss say: Madam,I'm Adam.

樣例輸出

11

提示

undefined

題目來源

NUPT

tring>
using namespace std;

int main(){
	int i,j,n,max;
	string s;
	getline(cin,s);
	n=(int)s.length();
	for(i=0,j=0;i<n;i++){
		if(s[i]>='a' && s[i]<='z'){
			s[j++]=s[i];
		}else if(s[i]>='A' && s[i]<='Z'){
			s[j++]=s[i]-'A'+'a';
		}
	}
	n=j;
	max=1;
	for(i=1;i<n;i++){
		for(j=1; i-j>=0 && i+j<n && s[i+j]==s[i-j]; j++);
		j--;
		if(max<2*j+1){
			max=2*j+1;
		}
		for(j=1; i-j>=0 && i-1+j<n && s[i-j]==s[i-1+j]; j++);
		j--;
		if(max<2*j){
			max=2*j;
		}
	}
	cout<<max<<endl;
}