LeetCode5 最长回文子串

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]

posted on 2022-08-13 17:01  solvit  阅读(13)  评论(0编辑  收藏  举报

导航