1. 程式人生 > >Manacher馬拉車演算法求解最長迴文子串

Manacher馬拉車演算法求解最長迴文子串

        馬拉車演算法是一種能在O(n)的時間複雜度範圍內得出結果。我看了不下幾次這個演算法,每次都覺得有點懂了,但是一碰到題目了,就生生寫不出來。歸根揭底,還是沒有掌握其思想。

  1. 馬拉車演算法的第一個核心思想就是往原始的字串裡填充一些輔助的東西,使得我們在考慮問題時不用考慮字串長度是奇數還是偶數。因為對於迴文字串來說,長度是奇數偶數時判斷是有些不同的
  2. 第二個核心思想就是用到了迴文字串的對稱性。

下面附上程式碼:

def manacher(s):
    s = '$'+'#'.join(s)+'#'
    print(s)
    half = [0]*len(s)
    mid, max_right = 0, 0
    maxLen = 0
    for i in range(len(s)):
        if i < max_right:
            half[i] = min(half[2*mid-i], max_right-i)
        else:
            half[i] = 1
        while i - half[i] >= 0 and i + half[i] < len(s) and s[i-half[i]] == s[i+half[i]]:
            half[i] += 1
        if max_right < i + half[i] - 1:
            max_right = i + half[i] - 1
            mid = i
        if maxLen < half[i]:
            maxLen = half[i]
            res = s[i-half[i]+1:i+half[i]]
    print(res.replace('#', ''))
    print(half)

array = "abaedsasd"
manacher(array)