Skip to content

Latest commit

 

History

History
64 lines (51 loc) · 1.61 KB

0005-最长回文子串.md

File metadata and controls

64 lines (51 loc) · 1.61 KB

给你一个字符串 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