【LeetCode】 最长回文子串

204 阅读1分钟

刷题刷题

思路

  1. 首先找到回文串的对称中心
    • 如果是奇数,对称中心在字符上
    • 如果是偶数,对称中心在字符之间。
  2. 然后从中心扩展,判断回文子串的外层是否还存在回文的情况。

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    if (!s || !s.length) return "";
    if (s.length === 1) return s;
    var result = s[0];

    for (var i = 0; i < s.length; i++) {
        var str1 = str2 = str = "";
        //偶数回文串
        if (s[i + 1] && s[i] === s[i + 1]) {
            str1 = getChildString(s, i, i + 1);
        }
        //奇数回文串
        if (s[i + 2] && s[i] === s[i + 2]) {
            str2 = getChildString(s, i, i + 2);
        }

        //比较回文串长度
        str = str1 > str2 ? str1: str2;
        if (str.length > result.length) {
            result = str;
        }
    }

    return result;
};

//判断中心外层是否还存在回文的情况
/**
 * @param {string} s
 * @param {int} left
 * @param {int} right
 * @return {string}
 */
function getChildString(s, left, right) {
    var str = left + 1 === right ? s[left] + s[right] : s[left] + s[left + 1] + s[right];

    while (--left >= 0 && ++right < s.length) {
        if (s[left] === s[right]) {
            str = s[left] + str + s[right]
        } else {
            break;
        }
    }
    return str;
}