【Leetcode】5.最长回文子串

64 阅读1分钟

leetcode-5.png

题目简述:在给定的字符串中找到最长的回文子串,这一题还是比较简单的,完成一个寻找回文字符串的方法即可,记录回文的起始结束的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
}