力扣解题——最长回文子串

·  阅读 161

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

题目描述

给你一个字符串 s,找到 s 中最长的回文子串。

  • 示例 1:
输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
复制代码
  • 示例 2:
输入: s = "cbbd"
输出: "bb"
复制代码
  • 示例 3:
输入: s = "a"
输出: "a"
复制代码
  • 示例 4:
输入: s = "ac"
输出: "a"
复制代码
  • 提示:
`1 <= s.length <= 1000`
`s` 仅由数字和英文字母(大写和/或小写)组成
复制代码

双指针实现

回文串我们可以理解成中间一个基点然后左右两边相互对称,这样就会形成两种情况:

  1. 偶数回文串

字符串abbacdb中心基点在bb之间

1.png 2. 奇数回文串 字符串abbabdb中心基点在a

2.png

知道两种回文串后,我们可以轻松的相处解决方案:遍历输入的字符串,在基点处定义左右两个指针,通过移动两个指针获取每个字符串对应符合条件的回文串,对比之后留下最长的回文串。

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    if (s.length == 1) {
        return s
    }
    let list = s.split('')
    let res = list[0]  //没有回文串默认取第一个字符
    for(let i = 0 ; i < list.length; i++) {
        numHandle(i, i) //奇数串
        numHandle(i, i + 1) //偶数串
    }
    function numHandle(li, ri) {
        while(li >= 0 && ri <= list.length - 1 && list[li] == list[ri]) {
            if (ri - li + 1 > res.length) { //与存储的回文串对比大小
                res = list.join('').slice(li, ri + 1)
            }  
            li--
            ri++
        }
    }
    return res
};
复制代码
分类:
前端
标签: