37 lines
1.3 KiB
JavaScript
37 lines
1.3 KiB
JavaScript
export const longestPalindrome = function (s) {
|
||
if (!s || !s.trim()) return ''
|
||
if (s.length === 1) return s
|
||
if (s.length === 2) return s[0] === s[1] ? s[0] + s[1] : s[1]
|
||
let result = ''
|
||
/**
|
||
*扩散坐标
|
||
*/
|
||
const calPalindromeIndex = function (left, right, s) {
|
||
const len = s.length
|
||
while (left >= 0 && right < len && s[left] === s[right]) {
|
||
left--
|
||
right++
|
||
}
|
||
return { left: left + 1, right: right }
|
||
}
|
||
for (let i = 0, len = s.length; i < len; i++) {
|
||
let even = ''
|
||
let odd = ''
|
||
if (s[i] === s[i + 1]) {
|
||
// 经过当前位与下一位判断已构成回文,扩散位直接从下一位开始,可以提速
|
||
const evenIndex = calPalindromeIndex(i - 1, i + 2, s)
|
||
even = s.slice(evenIndex.left, evenIndex.right)
|
||
}
|
||
const oddIndex = calPalindromeIndex(i - 1, i + 1, s)
|
||
odd = s.slice(oddIndex.left, oddIndex.right)
|
||
const re = odd.length > even.length ? odd : even
|
||
result = result.length > re.length ? result : re
|
||
}
|
||
return result
|
||
}
|
||
|
||
// 作者:liu-zi-qian-2
|
||
// 链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/5-zui-chang-hui-wen-zi-chuan-by-liu-zi-qian-2/
|
||
// 来源:力扣(LeetCode)
|
||
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|