尋找最長回文子串Manacher演算法學習筆記

2021-07-09 03:34:06 字數 1098 閱讀 3480

首先是用特殊符號比如#插到原字串每個字元之間的辦法,使得字串有了奇數個字元,這樣就永遠存在乙個中間字元,很巧妙。這不是關鍵。

這個演算法的關鍵是利用了已匹配回文串當前中點center左邊的字元i'i'的下標為2*center-i)兩邊的對稱匹配情況(即p[i']的值)從而得出中點center右邊對稱點i兩邊的對稱匹配情況。注意,只有border以內對稱部分i才可以參考i'的情況所以是min(border-i,p[2*center-i]),就是這樣。

python 實現**如下:

class solution:

# @return a string

def longestpalindrome(self, s):

t = '^#'+'#'.join(s) +'#%'

#最前面的^和最後的%只是為了防止程式中list索引越界

p=[0]*len(t)

center=border=0

for i in range(1,len(t)-1):

if border > i:

p[i] = min(border - i, p[2*center - i])

#對稱範圍內的字元的兩邊的對稱情況相同

else:

p[i] = 0

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

p[i] += 1

if i + p[i] > border:

center, border = i, i + p[i]

maxlen, centerindex = max((n, i) for i, n in enumerate(p))

return s[(centerindex - maxlen)//2: (centerindex + maxlen)//2]

#t中字母下標除以二正好是字母在s對應的下標

高效的求最長回文子串的演算法 Manacher

gdoi市選出了一道關於manacher的題目,於是打算學一下,但因為網路流鴿了一陣,最近才學完,學完後表示複雜度有點迷。manacher,俗稱馬拉車,是由一位名叫manacher的人與1975年提出的,這個演算法讓求最長回文子串的複雜度從o n 2 下降到了o n 先從n方演算法說起,n方演算法是...

如何尋找最長回文子串

5.最長回文子串 回文串是面試常常遇到的問題 雖然問題本身沒啥意義 本文就告訴你回文串問題的核心思想是什麼。首先,明確一下什 回文串就是正著讀和反著讀都一樣的字串。比如說字串aba和abba都是回文串,因為它們對稱,反過來還是和本身一樣。反之,字串abac就不是回文串。可以看到回文串的的長度可能是奇...

如何尋找最長回文子串

回文串是面試常常遇到的問題 雖然問題本身沒啥意義 本文就告訴你回文串問題的核心思想是什麼。首先,明確一下什 回文串就是正著讀和反著讀都一樣的字串。比如說字串aba和abba都是回文串,因為它們對稱,反過來還是和本身一樣。反之,字串abac就不是回文串。可以看到回文串的的長度可能是奇數,也可能是偶數,...