跳至主要內容

Mr.He小于 1 分钟

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    if (s.length < 2) {
        return s;
    }

    let start = 0;
    let maxLength = 1;

    // 辅助函数:从中心向两边扩展
    // left: 左边界索引, right: 右边界索引
    function expandAroundCenter(left, right) {
        // 当左右不越界且字符相等时,向外扩展
        while (left >= 0 && right < s.length && s[left] === s[right]) {
            left--;
            right++;
        }
        // 循环结束时,s[left] !== s[right],或者越界
        // 回文串的长度 = (right - 1) - (left + 1) + 1 = right - left - 1
        return right - left - 1;
    }

    for (let i = 0; i < s.length; i++) {
        // 情况1:以当前字符为中心(处理奇数长度,如 "aba")
        let len1 = expandAroundCenter(i, i);
        
        // 情况2:以当前字符和下一个字符之间为中心(处理偶数长度,如 "abba")
        let len2 = expandAroundCenter(i, i + 1);

        // 取两种情况中的最大长度
        let len = Math.max(len1, len2);

        // 如果发现了更长的回文串,更新起始位置和最大长度
        if (len > maxLength) {
            maxLength = len;
            // 根据长度和中心点计算起始索引
            // 举例:i=2, len=5 (abcba), start = 2 - 2 = 0
            // 举例:i=2, len=4 (abba), start = 2 - 1 = 1
            start = i - Math.floor((len - 1) / 2);
        }
    }

    return s.substring(start, start + maxLength);
};