LeetCode 5. 最长回文子串问题的 Manacher 算法(马拉车算法)

本文介绍解决最长回文子串问题的 Manacher 算法(马拉车算法),该问题为 LeetCode 第 5 题。


5. Longest Palindromic Substring(最长回文子串)


问题描述

LeetCode 5

Manacher 算法


参考资料:LeetCode 5 官方题解

LeetCode 5 官方题解 I
LeetCode 5 官方题解 II
LeetCode 5 官方题解 III
LeetCode 5 官方题解 IV

代码实现

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """

        if len(s) <= 0:
            return ''

        # 在各字符之间插入 '#',以处理回文子串长度为偶数的情况
        t = '$#'
        for i in range(len(s)):
            t += s[i] + '#'
        t += '%'

        list_radius = [0 for _ in range(len(t))]  # 各位置的回文半径
        right, centre = 0, 0  # 右边界和对应的回文中心
        for i in range(1, len(t) - 1):
            if right > i:  # 跳过当前位置的对称点在当前左右边界内的回文部分
                list_radius[i] = min(list_radius[2 * centre - i], right - i)
            else:
                list_radius[i] = 1

            # 当前位置的回文探索
            while t[i + list_radius[i]] == t[i - list_radius[i]]:
                list_radius[i] += 1

            # 更新左右边界
            if right < i + list_radius[i]:
                right = i + list_radius[i]
                centre = i

        r = max(list_radius)
        c = list_radius.index(max(list_radius))

        return ''.join(t[c - r + 1: c + r].split('#'))

运行效果

运行效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值