JS算法之最长回文子串

454 阅读1分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

最长回文子串

Hot100 5.最长回文子串

难度:中等

题目:leetcode-cn.com/problems/lo…

给你一个字符串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. 找中心,对于奇数需要找到s[i]为中心的回文串即可,而对于偶数需要找到s[i]s[i+1]为中心的回文串
  2. 使用左右指针往两边扩散,同时要防止越界,获取长度为奇数和偶数中回文子串的长度,并选择其中较大的那一个进行返回。
/**
 * @param {string} s
 * @return {string}
 */
function longestPalindrome(s) {
    let res = '';
    for (let i = 0; i < s.length; i++) {
        // 寻找长度为奇数的回文子串(以当前元素向两边扩散)
        const s1 = palindrome(s, i, i);
        // 寻找长度为偶数的回文子串(以s[i],s[i + 1])向两边扩散
        const s2 = palindrome(s, i, i + 1);
        // 找出最长的回文子串
        res = res.length > s1.length ? res : s1;
        res = res.length > s2.length ? res : s2;
    }
    return res;
};
​
function palindrome(s, l, r) {
    // 左右指针,从s[l]和s[r]向两边扩散,找到最长回文串
    while (l >= 0 && r < s.length && s[l] === s[r]) {
        l--; r++;
    }
    // 将回文串提取出来
    return s.substr(l + 1, r - l - 1);
}

时间复杂度:O(N^2)

空间复杂度:O(1)


坚持每日一练!前端小萌新一枚,希望能点个+在看哇~