首先是用特殊符號比如#
插到原字串每個字元之間的辦法,使得字串有了奇數個字元,這樣就永遠存在乙個中間字元,很巧妙。這不是關鍵。
這個演算法的關鍵是利用了已匹配回文串當前中點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就不是回文串。可以看到回文串的的長度可能是奇數,也可能是偶數,...