Manacher演算法 找字串最長的回文子串

2021-08-11 12:58:55 字數 1198 閱讀 7127

1、經典辦法:在兩頭和每個字元加上乙個特殊字元,相當於加了乙個軸,從頭遍歷判斷回文字元,得到的長度/2就是結果。時間複雜度:o(n^2)

2、manacher(和經典辦法相似,但有加速過程)時間複雜度:o(n):在兩頭和每個字元加上乙個特殊字元,相當於加了乙個軸

普及概念:

回文範圍=回文直徑=2*回文半徑=從乙個位置為中心出發擴出來的回文範圍

最右回文邊界:從左往右擴,用乙個變數記錄最右的邊界r,忽略是由哪個字元開始擴的

在此需要記錄乙個使得右邊界更新到更右的中心c。該變數與左右回文邊界是伴生的。

每乙個位置擴出來的回文半徑記錄在乙個陣列裡

此處設變數:

c:中心  

l:左邊界(根據最右回文邊界和中心c可得出。非最左回文邊界,c和r組成回文半徑時,對應找到的) 

r:最右回文邊界

(1)第一種情況:當前字元在最右回文邊界外面,暴力擴。不保證每次o(1),但總體能做到:o(n)

(2)第二種情況:當前字元k在最右回文邊界裡面。

a、 k的對稱點k'在左邊界l內     每次o(1),最多發生n次,o(n)

不用擴,k的對稱點k'的回文範圍就是k的回文範圍。

b、 k的對稱點k'不在左邊界l內     每次o(1),最多發生n次,o(n)

不用擴,字元k的回文半徑是k~r 

例子:

c 、k的對稱點k'與左邊界l壓線l。o(n)

可以確定k的回文範圍至少是l'~r',繼續判斷r後的下乙個字元

例子:

字串演算法manacher演算法

manacher是一種線性時間複雜度演算法,對於給定的字串s,可以在o n 時間內,求出以每個位置為中心的最長回文子串。插入無關字元 在相鄰字元之間以及字串首尾分別插入s中沒出現的字元,設為 得到str。則str中以任意位置為中心的最長回文串長度是奇數。記 p i max。因此只要求出p陣列即可。假...

KMP演算法查詢字串

使用kmp演算法查詢字串,時間效率為o m n include include include kmp演算法尋找字串匹配,時間效率為o m n void cmpnext const char pattern,int next next演算法 int main int argc,char argv e...

Sunday演算法 查詢字串

sunday演算法是用於查詢子串的一種演算法,具體的應用場景看這裡 相比於kmp,bm演算法,sunday演算法更快,並且更好理解 自認為哈 下面用比較正式的語言介紹一下該演算法 原字串為文字串,匹配的子串為模式串。從前往後匹配,在匹配失敗時,關注的是文字串中參加匹配的最末位字元的下一位字元。如果該...