JS leetcode 5. 最长回文子串

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

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文 

思路:遍历中心外扩法 

1、从某一字符开始,两种情况,单中心(..bab..)或者双中心(..baab..),取更长的

2、遍历整个字符串,找到最长的,并计算出此时的收尾字符

3、返回最长回文子串

var longestPalindrome = function(s) {
    if(!s)  return ''
    let start = 0,end = 0,n = s.length;
    let len = 0,len1 = 0,len2 = 0;
    for(let i = 0;i < n;i++){
        //单字符为中心
        len1 = currentLongest(s,i,i)
        //双字符为中心
        len2 = currentLongest(s,i,i+1)
        len = Math.max(len1,len2)
        //找到最长回文字符串的起始和结束位置
        if(len > end - start){
            start = i - Math.floor((len - 1) / 2);
            end = i + Math.floor(len / 2);
        }
    }
    return s.substring(start,end+1)
    
};
//左右扩展寻找最长回文长度
function currentLongest(s,left,right){    
    while(left >= 0 && right < s.length && s[left] == s[right]){
        left--;
        right++;
    }
    return right - left -1;
}

复杂度分析

  • 时间复杂度:O(n²),其中 n 是字符串的长度。长度为 1 和 2 的回文中心分别有 n 和 n−1 个,每个回文中心最多会向外扩展O(n) 次。

  • 空间复杂度:O(1)。

 

你可能感兴趣的:(JS,Leecode,javascript,leetcode,前端,算法)