「LeetCode打卡」05. 最长回文子串

181 阅读1分钟

🍑 题目详情

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

难度:⭐️⭐️

示例 1:

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

示例 2:

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

🍭 解题思路

动态规划

  1. 首先找到满足回文的条件:如果一个字符串adhda是回文,那么它的子串dhd是回文,那么h也是回文
  2. 动态规划我们可以假设i为子串的开头,j为子串的结尾,dp[i][j]表示是否为回文
  3. 根据1的回文条件: 如果dp[i][j]为回文,那么dp[i+1][j-1]也是回文
  4. 当i === j 时,一个字符一定也是回文
  5. 考虑一些临界值,当字符串的长度小于等于1,最长回文子串就是它本身

05.jpg

🍼 解题代码

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    if (s.length <= 1) return s

    let dp = new Array(s.length).fill([])
    let max = 0, // 最长长度
        maxStart = 0 // 最长子串的startIndex
    // 定义dp[i][j]的意义:从i到j的字符串是否为回文
    for (let j = 0; j < s.length; j++) { // i:表示以i为结尾的字符串
        for (let i = 0; i <= j; i++) { // j: 表示以j为开头的字符串
            if (i === j) {
                dp[i][j] = true
            } else if (s[i] === s[j] && (dp[i + 1][j - 1] || j - i <= 1)) { // 符合回文的条件
                dp[i][j] = true;
                if (j - i + 1 > max) {
                    max = j - i + 1
                    maxStart = i
                }
            }
        }
    }
    // console.log(maxStart, max)
    return s.substr(maxStart, max)
};