#include<cstdio>
#include<cstring>
const int maxn = 1010;
char S[maxn];
int dp[maxn][maxn]; //dp[i][j]表示S[i]至S[j]所表示的子串是否是回文子串
int main(){
gets(S);
int len = strlen(S), ans = 1;
memset(dp, 0, sizeof(dp)); //dp数组初始化为0
//边界
for(int i = 0; i < len; i++){
dp[i][i] = 1;
if(i < len - 1){
if(S[i] == S[i + 1]){
dp[i][i + 1] = 1;
ans = 2; //初始化时注意当前最长回文子串长度
}
}
}
//状态转移方程
for(int L = 3; L <= len; L++){ //枚举子串的长度
for(int i = 0; i + L - 1 < len; i++){ //枚举子串的起始端点
int j = i + L -1; //子串的右端点
if(S[i] == S[j] && dp[i + 1][j - 1] == 1){
dp[i][j] = 1;
ans = L; //更新最长回文子串长度
}
}
}
printf("%d\n", ans);
return 0;
}
/*
输入:
PATZJUJZTACCBCC
输出:
9
*/
最长回文子串
最新推荐文章于 2024-09-30 14:00:28 发布