manacher算法 python 实现

本文深入解析了Manacher算法,一种高效查找字符串中最长回文子串的方法。通过详细解释算法流程,包括预处理字符串、动态规划求解回文半径等步骤,帮助读者理解其核心思想及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def manacher(s):
    s = '#' + '#'.join(s) + '#'
    radis = [0] * len(s)
    maxlen, pos, max_right = 0, 0, 0

    for i in range(len(s)):
        if i < max_right:
            radis[i] = min(max_right - i, radis[pos * 2 - i])
        else:
            radis[i] = 1
        while i - radis[i] >= 0 and i + radis[i] < len(s) and s[i - radis[i]] == s [i + radis[i]]:
            radis[i] += 1
        if i - 1 + radis[i] > max_right:
            max_right = i - 1 + radis[i]
            pos = i
        maxlen = max(maxlen, radis[i])
    return maxlen-1


if __name__ == "__main__":

    print(manacher('cabaabaabaa'))

 

### 回答1: Manacher算法是一种用于求解最长回文子串的在线算法。它的基本思想是,在字符串的每个字符之间插入一个特殊字符,这样就能构成一个新的字符串,然后遍历这个新字符串,记录以每个字符为中心的最长回文子串的半径,最后根据这些半径计算出最长的回文子串的长度。用Python实现Manacher算法,首先需要定义一个变量p来存储以字符串中每个字符为中心的最长回文子串的半径,然后使用一个循环来遍历字符串,在每次循环内,根据当前字符的p值来判断当前字符为中心的最长回文子串的长度,然后根据算法的描述,使用双指针比较字符串中当前字符左右两边的字符,直到不相等,结束循环,最后根据得到的长度计算出最长的回文子串的长度。 ### 回答2: Manacher算法是一种用于查找字符串中最长回文子串的算法。它由Gus Manacher在1975年提出,并且在时间复杂度上可以达到线性级别。 Manacher算法利用了回文字符串两侧对称的性质,通过对中心进行扩展来找到最长的回文子串。为了处理奇数长和偶数长的子串,算法对原始字符串进行了特殊处理,在每个字符的两侧都插入了一个特殊的分隔符(通常用“#”),以便统一处理。 算法的主要思路是维护一个回文半径数组P,其中P[i]表示以字符s[i]为中心的最长回文子串的半径长度。同时维护两个辅助变量C和R,其中C表示当前找到的最长回文子串的中心,R表示这个子串的右边界。 算法的步骤如下: 1. 初始化回文半径数组P,以及两个辅助变量C和R。 2. 对于字符串s中的每个字符s[i],进行如下操作: a. 如果i在R的左边界之内,通过对称性找到s的对应字符j,并使用已知的P[j]来初始化P[i]。 b. 如果i在R的右边界之外,我们从i开始扩展,直到不再满足回文条件为止。 3. 在扩展过程中,我们同时更新C和R,以及相应的回文半径P。 4. 最后找到回文半径数组P中的最大值,以及对应的中心位置,即可得到最长回文子串。 Manacher算法通过扫描字符串一次,并且在每个字符上的操作都是常数时间复杂度,因此总体时间复杂度为O(n)。所以它在解决最长回文子串问题上具有很高的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值