题目简述:在给定的字符串中找到最长的回文子串,这一题还是比较简单的,完成一个寻找回文字符串的方法即可,记录回文的起始结束的index即可
只不过这一题要细致处理下,回文的这个问题, bab算回文,baab也是算回文,所以要计算两种的可能性
var longestPalindrome = function (s) {
let maxLength = 0
let left = 0, right = 0
for (let i = 0; i < s.length; ++i) {
// 奇数长度的回文串
let [l, r] = lengthOfPalindrome(i, i, s)
// 偶数长度的回文串
let [l1, r1] = lengthOfPalindrome(i, i + 1, s)
// 记录最大值以及下标
if (r - l + 1 > maxLength) {
left = l
right = r
maxLength = r - l + 1
}
if (r1 - l1 + 1 > maxLength) {
left = l1
right = r1
maxLength = r1 - l1 + 1
}
}
return s.substring(left, right + 1)
}
var lengthOfPalindrome = function (l, r, s) {
let left = l, right = r
while (left >= 0 && right < s.length && s[left] === s[right]) {
left--
right++
}
return [left + 1, right - 1]
}
下面用的slice
这里主要注意的就是left返回的时候需要 + 1,因为while不满足条件会跳出,跳出之前都会进行left--,right++,这就会导致index 出现在下一个地方
var longestPalindrome = function (s) {
let left = 0, right = 0
for (let i = 0; i < s.length; ++i) {
let [l1, r1] = lrPalindrome(i, i, s)
let [l2, r2] = lrPalindrome(i, i + 1, s)
let len1 = r1 - l1
let len2 = r2 - l2
if (len1 > right - left) {
[left, right] = [l1, r1]
}
if (len2 > right - left) {
[left, right] = [l2, r2]
}
}
return s.slice(left, right)
}
var lrPalindrome = function (left, right, s) {
while (left >= 0 && right < s.length && s[left] === s[right]) {
left--
right++
}
return [left + 1, right] // 注意这里是left + 1
}