5.最长回文子串|刷题打卡

253 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

最长回文子串

给你一个字符串 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. 回文一定是对称的
  2. 每次都选一个中心向两边扩展,比较两边字符串是否相等
  3. 回文字符串有两种
  • aba 中心点是 b。 palindromeStr(s, i, i)
  • aa 中心点是两个a中间。 palindromeStr(s, i, i+1)
  1. 两种方案得到的字符串与最开始 str 比较,把最长的字符串赋值给 str。这样str 中永远都是最长的回文字符串。
  2. 最后返回 str 即可

三、AC 代码:

/**
 * @param {string} s
 * @return {string}
 */
 var longestPalindrome = function(s) {
    let len = s.length, str = '';
    for(let i = 0; i < len; i++){
        let tem = '', tem2 = '';
        tem = palindromeStr(s, i, i);
        tem2 = palindromeStr(s, i, i+1);
        if(tem.length > str.length) {
            str = tem;
        }
        if(tem2.length > str.length) {
            str = tem2;
        }
    }
    return str;
};
// 获取回文字符串
var palindromeStr = function (s, left, right) {
    while(left >= 0 && right < s.length && s[left] == s[right]) {
        left--;
        right++;
    }
    return s.slice(left + 1, right)
}

四、总结:

image.png

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