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")