LeeCode 5. Longest Palindromic S

2018-03-08  本文已影响0人  scoyzhao
image.png

求最长回文字串,用了一个Manacher 算法。

image.png

以下是根据题目要求用JavaScript完成的代码:

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function (s) {
    var s1 = '#' + s.split('').join('#') + '#'
    // 建立长度为s的长度的数组
    var RL = new Array(s.length)
    // 数组填充为0
    RL.fill(0)
    var maxStr = ''
    // 最大值,对称轴,最右
    var max = 0, pos = 0, maxRight = 0
    
    // 特殊情况
    if(s.length < 2) {
        return s
    }

    for (let i = 0; i < s1.length; i++) {
        if (i < maxRight) {
            RL[i] = Math.min(RL[2 * pos - i], maxRight - i)
        } else {
            RL[i] = 1
        }
        // 条件含义:1.不超总长度,2.是回文,3.不能把左边突破了
        while (RL[i] + i < s1.length && s1[i - RL[i]] == s1[i + RL[i]] && i - RL[i] >= 0) {
            RL[i] += 1
        }
        if (RL[i] + i -1 > maxRight) {
            maxRight = RL[i] + i -1
            pos = i
        }
        if(RL[i] - 1 > max) {
            max = RL[i] - 1
            // 处理字符串
            maxStr = s1.slice(i - RL[i] + 1, i + RL[i]).replace(/[#]/g, '')
        }
    }
    
    return maxStr
};
上一篇 下一篇

猜你喜欢

热点阅读