問題
某個字符串$S$的部分字符串(Substring)是指,從字符串$S$中提取連續的部分而構成的字符串。即,$S=$"abcd"字符串存在"abcd","abc", "bcd", "ab", "bc","cd", "a", "b", "c", "d"。同樣,Palindrome是指順讀和倒讀都一樣的詞語。比如,"abcba","abba", "aba"就是Palindrome,但"abcabc" 等則不是Palindrome。給出字符串$S$時,請求出字符串$S$的部分字符串中可以Palindrome的最大長度。
輸入
在第一行給出字符串$S$,字符串$S$只能由大寫的羅馬字母構成,長度在$5\,000$ 以內。
輸出
輸出給出的字符串的最長的PalindromeSubstring的長度。
案例輸入
ADEEDCCDEEA
案例輸出
8
C++代碼實現
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char ch1[5000], ch2[10001];
int j = 0;
int maxl = 0;
int getLen(int idx){
int templ = 1;
for (; idx + templ <= j && idx - templ >= 0; templ++){
if (ch2[idx + templ] != ch2[idx - templ]) break;
//templ++;
}
return (templ - 1) / 2;
}
int main(){
scanf("%s", ch1);
int ln = strlen(ch1);
ch2[0] = '#';
for (int i = 0; i < ln; i++) {
ch2[++j] = ch1[i];
ch2[++j] = '#';
}
for (int i = 2; i < j - 1; i++){
int templ = getLen(i);
templ += templ;
if (templ>0 && ch2[i] != '#') templ++;
if (templ>maxl) maxl = templ;
// i++;
}
printf("%d\n", maxl);
return 0;
}