5. Longest Palindromic Substring

67 阅读1分钟

5. Longest Palindromic Substring

解题思路

  1. 假设最大字回文长度是 maxLen = 1 开始位置是 low = 0
  2. 遍历 s, 分为 ’aba‘ 奇数 偶数 ’abba‘ 两种情况
  3. extendPalindrome 即声明了两个指针 left right 向两边扩散,如果是回文的话直接进行 left-- right++ 的操作,
  4. left >= 0 左边界条件 right < len 左边界条件 回文条件 s[left] === s[right] 以 ’aba‘ 为例 i = 1 left = 1 right = 1 最终 left = -1 right = 3
  5. 那么 回文最长为 maxLen = 3 - (-1) - 1 low = left = -1 + 1
  6. 最终需要截取的为 s.substring(low, maxLen)

代码

/**
 * @param {string} s
 * @return {string}
 */
const longestPalindrome = function (s) {
  let low = 0 // 起始位置
  let maxLen = 1 // 假设回文最大长度

  const len = s.length

  if (len < 2) { // s 是 0 或者 1 直接返回
    return s
  }

  const extendPalindrome = (s, left, right) => {
    // 左右两个指针向两边扩 left-- right++ 判断回文成立的最大长度
    // 奇数个的时候 s = ’aba‘ left = 1 right = 1

    while (left >= 0 && right < len && s[left] === s[right]) {
      left--
      right++
    }

    // left right 最后都检查完了 left = -1 right = 3 最后计算的长度需要再减去 1
    if (maxLen < right - left - 1) {
      low = left + 1
      maxLen = right - left - 1
    }
  }

  for (let i = 0; i < len - 1; i++) {
    extendPalindrome(s, i, i) // ’aba‘ 奇数个的回文
    extendPalindrome(s, i, i + 1) // ’abba‘ 偶数个的回文
  }

  return s.substring(low, low + maxLen)
}

longestPalindrome('babad')