演算法學習 最長回文子串

2021-07-23 23:06:59 字數 989 閱讀 1664

求最長回文子串最有效率的演算法是manacher演算法,時間複雜度為o(

n),空間複雜度同樣是o(

n)

具體演算法過程參考其他博文,這裡只貼一下我自己實現的python**。遺憾地是,hihocoder的提交顯示為tle,執行超時,而我的**在demo資料中表現正常,可能是python的效率問題吧。

def

longestpalindrome

(str):

answer = 0

l = len(str)

if l <= 1:

return str

res = preprocess(str)

n = len(res)

p = [0]*n

id, mx = 0, 0

for i in range(1, n-1):

j = 2*id - i

p[i] = min(mx - i, p[j]) if mx > i else

1while i-p[i] >= 0

and i+p[i] <= n-1

and res[i-p[i]] == res[i+p[i]]:

p[i] += 1

if i+p[i] > mx:

mx = i + p[i]

id = i

if p[i] > answer:

answer = p[i]

return answer - 1

defpreprocess

(str):

string = '#'

string += '#'.join(str)

string += '#'

return string

numcases = int(raw_input())

for i in range(numcases):

print longestpalindrome(raw_input())

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

首先是用特殊符號比如 插到原字串每個字元之間的辦法,使得字串有了奇數個字元,這樣就永遠存在乙個中間字元,很巧妙。這不是關鍵。這個演算法的關鍵是利用了已匹配回文串當前中點center左邊的字元i i 的下標為2 center i 兩邊的對稱匹配情況 即p i 的值 從而得出中點center右邊對稱點i...

最長回文子串求解 馬拉車演算法學習

以hidocoder上的一道裸題為例 如果我們不會manacher演算法。我們應該如何解決這個問題呢?我們首先學習乙個叫中心擴充套件演算法的東西。對於回文串我們可以選擇乙個中心,進行左右擴充套件,判斷左右兩邊字元是否相等。因為字元存在奇數個或者偶數個,我們可以選擇每個字元或者兩個字元之間的空格進行擴...

演算法 最長回文子串

題目描述 對於乙個字串,請設計乙個高效演算法,計算其中最長回文子串的長度。給定字串a以及它的長度n,請返回最長回文子串的長度。例如 輸入 abc1234321ab 12 返回值 7 最長回文子串 public static intgetlongestpalindrome string a,int n...