给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 示例 2:
输入:s = "cbbd" 输出:"bb" 示例 3:
输入:s = "a" 输出:"a" 示例 4:
输入:s = "ac" 输出:"a"
提示:
1 <= s.length <= 1000 s 仅由数字和英文字母(大写和/或小写)组成
没啥好的思路,直接看的题解 题解有很多思路,动态规划不太看得懂,看了一下中心拓展法决定使用这个解题试试
var longestPalindrome = function(s) {
if (!s || s.length < 2) {
return s
}
let start = 0, end = 0
let len = s.length
const centerFixed = (left, right) => {
while (left >=0 && right < len && s[left] === s[right]) {
left--
right++
}
return right - left - 1
}
for (let i = 0; i < len; i++) {
const max1 = centerFixed(i, i) // 奇数的情况判断回文
const max2 = centerFixed(i, i + 1) // 偶数的情况判断回文
const max = Math.max(max1, max2)
if (max > (end - start)) {
start = i - ((max - 1) >> 1) // >> 1 除以 2
end = i + (max >> 1)
}
}
return s.substring(start, end + 1)
};
步骤如下
- 先创建一个中心拓展函数获取每次循环执行后的最大回文长度,其中值得注意的是要判断奇数和偶数两种情况
- 循环执行函数,获取max,判断max是否比当前存储的回文最大长度要大,若是大于则进行赋值
- start赋值需要使max先-1再进行除二处理,因为i当前的值也需要占一个位置,所以向前设置时需要减去1