算法TS-最长回文子串

64 阅读1分钟

力扣中等题:5. 最长回文子串 给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

示例 2:

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

提示:

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

找回文子串时注意,回文子串有奇数位和偶数位,比如ababb,用贪心思想,以一个字符串位置为中心像两边扩散,寻找奇数位和偶数位的回文子串,伪代码为:

for 0 <= i < len(s):
    找到以 s[i] 为中心的回文串,奇数位的子串
    找到以 s[i]s[i+1] 为中心的回文串,偶数位的子串
    更新答案

那么直接撸代码:

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let res = ''
    for(let i = 0; i < s.length; i++) {
        const s1 = help(s, i, i);// 奇数位回文子串
        const s2 = help(s, i, i+1);//偶数位回文子串
        res = res.length > s1.length ? res : s1
        res = res.length > s2.length ? res : s2
    }
    return res
};
function help(str, left, right) {
    while(left >=0 && right < str.length && str[left] === str[right]) {
        left--;
        right++;
    }
    return str.substring(left+1, right)// 这是一个关键点,为什么是left + 1呢?
    // 带入一个奇数位的子串,str[i] === str[i],所以left--,right++,但是外扩以后str[i-1]可能不等于str[i+1],sustring裁切时,其实位置就不对了,需要修正
}