创见博客
最长回文子串
七崽爱吃小饼干2026/01/24阅读 1专栏 算法合集

最长回文子串

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

示例 1:

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

示例 2:

codeType
输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

解法

ts
function longestPalindrome(s: string): string {
    // F[i][j]表示从i-j的子串是否是回文串
    // F[i][j] = F[i + 1][j - 1] & s[i] === s[j]
    // 因为i,j要由i+1,j-1推导得到,所以l==1和l==2的情况要单独处理,否则越界
    const n = s.length
    const dp = new Array(n).fill(0).map(() => new Array(n).fill(false))
    let maxlen = 0, startIndex = 0
    // 因为状态回归方程的推倒顺序是从短串到长串,所以要按照长度从1->len进行遍历
    for(let l = 1; l <= n; l++){ // 按照长度进行遍历
        for(let i = 0; i < n; i++){ // i是行号,在每行找到对应长度的长度为1的串
            // 由i和l可以推导j,j是右边界
            let j = l + i - 1
            if(j >= n){ // j越界
                break
            }
            if(l === 1){ // 长度为1的串直接true,也就是矩阵对角线
                dp[i][j] = true
            }else if(l === 2){ // 长度为2的串直接比较s[i] s[j]
                dp[i][j] = s[i] === s[j]
            }else{
                dp[i][j] = dp[i + 1][j - 1] && s[i] === s[j]
            }
            if(l > maxlen && dp[i][j]){
                maxlen = l
                startIndex = i
            }
        }
    }
    return s.slice(startIndex, maxlen + startIndex)
};
评论
0/100