🍑 题目详情
给你一个字符串 s,找到 s 中最长的回文子串。
难度:⭐️⭐️
示例 1:
给你一个字符串 `s`,找到 `s` 中最长的回文子串。
示例 2:
输入: s = "cbbd"
输出: "bb"
🍭 解题思路
动态规划
- 首先找到满足回文的条件:如果一个字符串
adhda是回文,那么它的子串dhd是回文,那么h也是回文 - 动态规划我们可以假设i为子串的开头,j为子串的结尾,
dp[i][j]表示是否为回文 - 根据1的回文条件: 如果
dp[i][j]为回文,那么dp[i+1][j-1]也是回文 - 当i === j 时,一个字符一定也是回文
- 考虑一些临界值,当字符串的长度小于等于1,最长回文子串就是它本身
🍼 解题代码
/**
* @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)
};