1. 题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

  1. 输入: "babad"
  2. 输出: "bab"
  3. 注意: "aba" 也是一个有效答案。

示例 2:

  1. 输入: "cbbd"
  2. 输出: "bb"

2. 解题思路

使用中心扩展的方法:

  • 选取对称中心(奇数长度的字符串为中心两个字符的中间,偶数长度的字符串中心为中间的字符)
  • 通过对比选择出两种组合较大的回文子串长度
  • 对比之前的长度,判断是否更新起始的位置
  • 遍历完之后,根据起始位置,截取最长回文子串

    3. 代码实现

    1. /**
    2. * @param {string} s
    3. * @return {string}
    4. */
    5. var longestPalindrome = function(s) {
    6. if(s == null || s.length <1){
    7. return ''
    8. }
    9. let start = 0
    10. let end = 0
    11. // 定义中心扩展的方法
    12. const fn = (s,left,right) => {
    13. while(left >=0 && right< s.length && s[left] === s[right]){
    14. left--
    15. right++
    16. }
    17. return right - left -1
    18. }
    19. // 遍历字符串
    20. for(let i = 0; i<s.length; i++){
    21. const len1 = fn(s, i, i)
    22. const len2 = fn(s, i, i+1)
    23. const len = Math.max(len1, len2)
    24. // 判断起始位置是否更新
    25. if(len > end - start){
    26. start = i- Math.floor((len-1)/2)
    27. end = i+ Math.floor(len/2)
    28. }
    29. }
    30. return s.substring(start, end+1)
    31. };

    4. 提交结果

    5. 最长回文串 - 图1