Mancher演算法總結 馬拉車

2021-08-20 17:27:00 字數 1356 閱讀 4855

本文在這篇文章的基礎上完成。下面說下mancher演算法。

一、mancher可以解決的問題

1、字串轉換

回文字串長度可是奇數,也可是偶數。為了方便處理,我們通過在每個字元之間以及字元首位加特殊符號的方式來統一奇偶問題。舉個例子:

s=「abba」,變為t="#a#b#b#a#" 。我們會發現s的長度是4,而t的長度為9,長度變為奇數了。

那s的長度為奇數的情況時,變化後的長度還是奇數嗎?

再舉個例子:

s=「abcba」,變化為t=「#a#b#c#b#a#」,t的長度為11。

所以我們發現其改造的目的是將字串的長度變為奇數,這樣就可以統一的處理奇偶的情況了。

2、計算新字串的回文半徑

圖一陣列p有這樣的性質,p[i] - 1 = 原字串中,以當前i點元素為中心的回文字串的長度。證明過程如下

在字串t中,以i點為中心的回文長度為:2p[i]-1,p[i]為半徑。

假設,該回文字串的中'#'為y個,非'#'為x個,那麼:

x + y = 2p[i] - 1;

通過圖(1)可知,該回文中'#'一定比非'#'多乙個,即:

y -x = 1;

解以上兩個方程得:

圖二假設,當前最長回文的邊界為[l,r],mi為中心,求p[i]的值。毫無疑問,現在i點以前的元素都值都計算過了,根據回文的特性,i點關於mi的對稱點j的值p[j],而且,p[i] = p[j]。根據對稱關係,i-mi = mi - j得到j = 2mi - i。

當 i < r時

如果,p[i] < r - i,說明以元素i為中心的回文長度一定在區間(r,l)內。

如果,p[i] >= r - i,說明以第i個字元為中心的回文半徑可能已經超出r了,至於是否超出,要看第(r+1)個字元關於點i是否對稱。

當 i >= r時,只能做以i為中心的字元對稱匹配。

function regular_str(s)

return res;

}function mancher(str)

if(r < p[i]+i-1)

if(max_length < p[i])

} return max_length-1;

}

馬拉車演算法總結

演算法簡述 馬拉車 manacher 演算法是在o n 時間內解決尋找源字串的最長回文子串s的問題的演算法。樸素演算法情況下對於每乙個s i 都要左右遍歷其最大回文子串,所以時間複雜度是o n2 演算法原理 充分利用之前求得的s j 為求s i 服務。預處理 在每個字元左右兩邊插入 將字串變成奇數串...

馬拉車演算法

思路筆記 上述情況1和情況2又可以歸結為 i 的回文半徑 和 r i的距離 中小的那個就是i的回文半徑。include include includeusing namespace std string manacherstring string str return res int min int...

馬拉車演算法

馬拉車演算法是一種計算最長回文子串的演算法,以其優秀的線性複雜度聞名於世,相較於o n 2 o n 2 o n2 的dpdp dp演算法和會被特殊資料卡到o n 2 o n 2 o n2 的暴力演算法,馬拉車演算法無疑是求解最長回文子串的最優選擇。最長回文子串分為偶數串和奇數串,為了避免這些問題,馬...