5. 最长回文子串

问题

给你一个字符串 s,找到 s 中最长的 回文 子串。

示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:
输入:s = "cbbd"
输出:"bb"

分析

递推:s[i][j] = s[i-1][j-1] && s[i] == s[j],所以要枚举左边界以及右边界,从c++实现来看,枚举子串长度以及左边界,可以计算右边界,写代码比较方便。

代码

class Solution {
public:
    static const int N = 1e3+10;
    bool f[N][N]; // f[i][j]表示s[i...j]是否为回文
    int begin = 0, max_L = 1;
    int n = 0;
    string longestPalindrome(string s) {
        n = s.size();
        if (n < 2) {return s;}
        for (int i = 0; i < n; i++) {
            f[i][i] = true;
        }
        // 枚举子串长度
        for (int L = 2; L <= n; L++) {
            for (int i = 0; i < n; i++) { // 枚举左边界i
                int j = L + i - 1;
                if (j >= n) {break;}
                if (s[i] != s[j]) {f[i][j] = 0; } 
                else {
                    if (j - i < 3) {f[i][j] = 1; }
                    else {f[i][j] = f[i+1][j-1]; }
                }
                if (f[i][j] && j-i+1 > max_L) {
                    max_L = j-i+1;
                    begin = i;
                }
            }
        }
        return s.substr(begin, max_L);
    }
};
posted @ 2025-10-01 15:50  saulstavo  阅读(12)  评论(0)    收藏  举报