求最長回文子串最有效率的演算法是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...