1. 程式人生 > >Lintcode 迴文系列

Lintcode 迴文系列

比較重要的一個是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是為了利用之前已經計算的迴文字串來計算將要計算的迴文字串。