dp[j][i] = 1代表从j到i的子串是回文串
一共三种情况的
- j == i , 说明只有一个字符,一定是回文
- i-j == 1 说明只有两个字符,此时如果str[i] == str[j], 说明一定是回文串
- i-j > 1 说明有两个以上的字符,这时候,如果str[i] == str[j] , 那么就可以从第一种或者第二种情况转移过来,当dp[j+1][i-1] = 1的时候, 这就代表dp[j][i]也是1
这样dp就可以转移过来,然后在算dp的过程当中顺便用i-j+1来算出每次回文串的长度,然后取最大值
#include <iostream>
using namespace std;
const int maxn = 2500+10;
int dp[maxn][maxn];
int main() {
int ans = -1;
string str;
cin >> str;
int len = str.size();
for(int i = 0; i < len ; i++){
for(int j = i; j >= 0; j--){
if(i == j){
dp[j][i] = 1;
ans = max(ans, i-j+1);
}
else if(i-j == 1 && str[i] == str[j]) {
dp[j][i] = 1;
ans = max(ans, i-j+1);
}
else if(str[i] == str[j] && dp[j+1][i-1] == 1){
dp[j][i] = 1;
ans = max(ans, i-j+1);
}
}
}
cout << ans;
return 0;
}
// 64 位输出请用 printf("%lld")



京公网安备 11010502036488号