LeetCode5 最长回文子串
Manacher 算法
# 最长回文子串, Manacher
class Solution:
def expend(self, s, left, right):
while left >= 0 and right < len(s) and s[left] == s[right]:
left, right = left - 1, right + 1
return (right - left - 2) // 2
def longestPalindrome(self, s: str) -> str:
end, start = -1, 0
s = '#' + '#'.join(list(s)) + '#'
arm_len, r, c = [], -1, -1
for i in range(len(s)):
if r >= i:
i_sym = 2 * c - i
min_arm_len = min(arm_len[i_sym], r - i)
cur_arm_len = self.expend(s, i - min_arm_len, i + min_arm_len)
else:
cur_arm_len = self.expend(s, i, i)
arm_len.append(cur_arm_len)
if i + cur_arm_len > r:
c, r = i, i + cur_arm_len
if 2 * cur_arm_len + 1 > end - start + 1:
start, end = i - cur_arm_len, i + cur_arm_len
return s[start + 1:end + 1:2]