解题思路
- 假设最大字回文长度是
maxLen = 1 开始位置是 low = 0
- 遍历
s, 分为 ’aba‘ 奇数 偶数 ’abba‘ 两种情况
- extendPalindrome 即声明了两个指针 left right 向两边扩散,如果是回文的话直接进行 left-- right++ 的操作,
- left >= 0 左边界条件 right < len 左边界条件 回文条件 s[left] === s[right] 以 ’aba‘ 为例 i = 1 left = 1 right = 1 最终 left = -1 right = 3
- 那么 回文最长为 maxLen = 3 - (-1) - 1 low = left = -1 + 1
- 最终需要截取的为 s.substring(low, maxLen)
代码
const longestPalindrome = function (s) {
let low = 0
let maxLen = 1
const len = s.length
if (len < 2) {
return s
}
const extendPalindrome = (s, left, right) => {
while (left >= 0 && right < len && s[left] === s[right]) {
left--
right++
}
if (maxLen < right - left - 1) {
low = left + 1
maxLen = right - left - 1
}
}
for (let i = 0; i < len - 1; i++) {
extendPalindrome(s, i, i)
extendPalindrome(s, i, i + 1)
}
return s.substring(low, low + maxLen)
}
longestPalindrome('babad')