leetCode打卡——5 Longest Palindromic Substring

328 阅读1分钟

题目

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

var longestPalindrome = function(s) {
    if (s.length === 1) return s;

    var res = '';

    var time = s.length;
    while (time--) {
        let nowRes = '';
        var nowMidIndex = s.length - time - 1;
        
        var nowRepeatMidIndex = nowMidIndex;
        while (s[nowMidIndex] === s[++nowRepeatMidIndex]) {
            ;
        }
        nowRepeatMidIndex--;
        nowRes = s.slice(nowMidIndex, nowRepeatMidIndex + 1);
        var extraCount = 1;
        while (s[nowMidIndex - extraCount] && s[nowRepeatMidIndex + extraCount] && s[nowMidIndex - extraCount] === s[nowRepeatMidIndex + extraCount]) {
            nowRes = `${s[nowMidIndex - extraCount]}${nowRes}${s[nowMidIndex - extraCount]}`;
            extraCount++;
        }

        if (res.length < nowRes.length) {
            res = nowRes;
        }
    }

    return res;
};

刚做了第70题,想多练习一下动态规划的题目,这道题是题号最小的动态规划

这道题一开始我没有想出来,看了题解才有思路。

思路:

  1. 当一个子字符串是一个回文字符串,那么在该字符串头尾添加一个相同的字符,新字符串依旧是回文字符串;
  2. 我们把子字符串分成3部分:中间重复字符串部分,头部和尾部,'abaaaba',该字符串中间重复字符串部分是'aaa',头部是'ab',尾部是'ba';
  3. 遍历输入字符串的所有字符,先根据当前字符,判断后续字符是否一致,如果一致则不断拓展中间字符串部分,直至遇到与当前字符不一样的字符;
  4. 得到了中间字符串,此时也是一个回文字符串,就可以开始拓展头部和尾部,如果当前回文字符串的两侧都有字符并且相等,那么当前回文字符串拓展向前向后拓展一位。如果有一侧不存在字符了,或者两侧存在的字符不一致,那么当前字符的最长回文字符串就到此结束了;
  5. 遍历所有的字符得到对应的最长回文字符串,其中最长的回文字符串就是结果。