Lintcode 迴文系列
阿新 • • 發佈:2018-11-06
比較重要的一個是Manacher演算法O(n)解決最長子迴文串問題。
def longestPalindrome(s): #manacher algorithm s='#'+'#'.join(s)+'#' longest=0 L=[0 for x in range(len(s))] maxRight=0 center=0 for i in range(len(s)): if i<maxRight: L[i]=min(L[2*center-i],maxRight-i) else: L[i]=0 while i-L[i]>=0 and i+L[i]<len(s) and s[i+L[i]]==s[i-L[i]]: L[i]=L[i]+1 if i+L[i]-1 >maxRight: maxRight=i+L[i]-1 center=i longest=max(L) max_idx=L.index(longest) ss=s[max_idx-longest+1:max_idx+longest] return ss.replace('#','')
上述程式碼中,longest是最長的子迴文字串的長度,maxRight是當前迴文能到達的最右邊的位置,注意這裡位置的概念是指插入了特殊符號#之後,N個字元和N+1個#構成的位置,使用maxRight是為了利用之前已經計算的迴文字串來計算將要計算的迴文字串。