编程语言
首页 > 编程语言> > manacher(马拉车)算法

manacher(马拉车)算法

作者:互联网

给定字符串s,找到s中最长的回文子串。
回文串,指的是无论从左往右读还是从右往左读,结果都是一样的。
比如 “dabcbacf” 的最长回文子串为 “abcba”。

manacher算法

动态规划:

def manacher(string):
    s = '$#' + '#'.join([x for x in string]) + '#0'
    l = len(s)
    p = [0] * l
    max_ = 0
    id_ = 0

    for i in range(l - 1):
        if max_ > i:
            p[i] = min(max_ - i, p[2 * id_ - i])
        else:
            p[i] = 1

        while s[i + p[i]] == s[i - p[i]]:
            p[i] += 1

        if i + p[i] > max_:
            max_ = p[i]
            id_ = i
    mxr = max(p) - 1    # 最大回文长度
    ind = p.index(max(p))
    res = s[ind - mxr:ind + mxr + 1].replace('#', '')   # 最长回文
    print(mxr)
    print(res)

标签:manacher,位置,mxr,算法,max,半径,拉车,id,回文
来源: https://blog.csdn.net/u010384079/article/details/100672168