add: 最长回文字符串
This commit is contained in:
36
src/string/longest-palindromic-substring.js
Normal file
36
src/string/longest-palindromic-substring.js
Normal file
@ -0,0 +1,36 @@
|
||||
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)
|
||||
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
Reference in New Issue
Block a user