#include <iostream>
using namespace std;
#include <string>
#include <vector>
int main() {
    string str;
    getline(cin, str);
    vector<vector<bool>> dp(str.size(), vector<bool>(str.size(), false));

    int m = 0;
    for (int i = str.size() - 1; i >= 0; i--) {
        for (int j = i ; j < str.size(); j++) {
            if (str[i] == str[j]) {
                if(str[i] == str[j]){
                    if(j - i<=1){
                        dp[i][j] = true;
                    }
                    else if(dp[i+1][j-1]){
                        dp[i][j] = true;
                    }
                }
                if(dp[i][j] && (j-i+1)>m){
                    m = j-i+1;
                }
            }

        }
    }

    cout << m << endl;

}

题目没讲的太具体,我还以为是最长回文子序列,结果提交后是最长回文子串问题

附上笔记:

3.1 回文子串

3.1.1 问题描述
  • 给定一个字符串,找出其中所有的回文子串(左右对称的串)
3.1.2 dp[I][J]的含义
  • [i,j]这个范围内子串是否为回文子串(true/false)
3.1.3 递推公式
  • if(s[i] == s[j])情况一 i==j a情况二 i和j相差1 aa情况三 i和j相差大于1 依赖于dp[i+1][j-1]
if (s[i] == s[j]) {
    if (j - i <= 1) { // 情况一 和 情况二
        result++;
        dp[i][j] = true;
    } else if (dp[i + 1][j - 1]) { // 情况三
        result++;
        dp[i][j] = true;
    }
}
  • result就是统计回文子串的数量
3.1.4 数组初始化
  • dp[i][j] = false
3.1.5 遍历顺序
  • dp[i][j]依赖于dp[i + 1][j - 1]从底部往上,从左往右j>=i,只有右上一半有数据
for (int i = s.size() - 1; i >= 0; i--) {  // 注意遍历顺序
    for (int j = i; j < s.size(); j++) {
        if (s[i] == s[j]) {
            if (j - i <= 1) { // 情况一 和 情况二
                result++;
                dp[i][j] = true;
            } else if (dp[i + 1][j - 1]) { // 情况三
                result++;
                dp[i][j] = true;
            }
        }
    }
}