LeeCode 5. Longest Palindromic S
2018-03-08 本文已影响0人
scoyzhao

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

以下是根据题目要求用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
};