#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
char S[maxn];
int dp[maxn][maxn]; //dp[i][j] = 0表示S[i]到S[j]不是回文子串,dp[i][j] = 1表示S[i]到S[j]是回文子串
int main() {
cin.getline(S, maxn);
int len = strlen(S), ans=1;
//设置边界
fill(dp[0], dp[0] + maxn * maxn, 0);//dp数组初始化为0
//边界
for (int i = 0; i < len; i++) {
dp[i][i] = 1;
if (i < len-1 && 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;
}
动态规划——最长回文子串代码模板C++
最新推荐文章于 2023-06-29 15:16:49 发布