125 - 5 最长回文子串
题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
解答
中心扩展
循环选择中心,然后两边扩展看看左右是否相等。
中心点不仅要选择字符,也要选择字符之间。
var longestPalindrome = function(s) {
if (!s || s.length < 1) {
return ""
}
let start = 0,
end = 0
for (let i = 0; i < s.length; i++) {
const len1 = palindromic(s, i, i)
const len2 = palindromic(s, i, i + 1)
const max = Math.max(len1, len2)
if (max > end - start) {
start = i - ~~((max - 1) / 2)
end = i + ~~(max / 2)
}
}
return s.slice(start, end + 1)
};
const palindromic = function(s, left, right) {
let L = left,
R = right
while (L >= 0 && R < s.length && s[L] === s[R]) {
L--
R++
}
return R - L - 1
}Runtime: 80 ms, faster than 81.37% of JavaScript online submissions for Longest Palindromic Substring.
Memory Usage: 35.8 MB, less than 78.26% of JavaScript online submissions for Longest Palindromic Substring.
manacher
专门用于解决最长回文子串的问题
先是在所有字符中间加一个#,这样字符中间也有格子。
检验最大字符串的时候,也没必要向后找,因为对称的关系,向前的距离就是原来数组中的最大长度。

维护一个数组p,用来记录改字符的回文半径
其次维护 最大探索的右边max_right,和与之对应的探索中心mid
简言之,当 i < maxRight 的时候,p[i] 就是 p[mirror] 的信息(以mid为轴的mirror)
以 maxRight - i 作为参考标准,p[i] 的值应该是二者之中较小的那个值
就是说,i遍历到与mid对应的那个值,p[i]可以照抄p[mirror],这样就省了再次计算的步骤了
Runtime: 80 ms, faster than 96.98% of Python3 online submissions for Longest Palindromic Substring.
Memory Usage: 13.8 MB, less than 22.69% of Python3 online submissions for Longest Palindromic Substring.
动态规划
回文串要满足,去掉最外侧两个字符,依然是回文串。或者去掉后根本不构成字符串。
https://leetcode.com/problems/longest-palindromic-substring/discuss/121496/Python-DP-solution
Runtime: 3376 ms, faster than 37.94% of Python3 online submissions for Longest Palindromic Substring.
Memory Usage: 22.4 MB, less than 5.04% of Python3 online submissions for Longest Palindromic Substring.
Last updated
Was this helpful?