Manacher算法(馬拉車算法)時間復雜度O(n)
用過中心檢測法(就是上面說的O(n2) O(n^2)O(n
)的算法)的都知道對於奇數回文串和偶數回文串的處理是不同的,奇數回文串有2n+1 2n+12n+1個字符,所以中心字符一定只有一個。而同理,對於偶數回文串,中心字符有2個。這樣1個和2個的情況不好處理,所以我們將給出的串統一轉化為奇數回文串。我們將每一個字符的左邊和右邊都添加一個字符(這個字符是輸入中所沒有的)。一般都為#。比如說abc和abcd這兩個串轉化后就為#a#b#c#和#a#b#c#d#。長度分別為7 77和9 99這樣無論奇偶都能被轉換成奇數回文串了.
其實在我看來,Manacher就是優化后的中心檢測法,和KMP算法類似,Manacher的思想也是避免"匹配"失敗后的下標回退
下面正式開始分析算法
首先,我們需要了解一個叫做回文半徑
的東西
當前循環到i=0
當前元素為=#
當前最大回文半徑R=0
當前中心位置flag=0
當前最大半徑r=1
=============================
當前循環到i=1
當前元素為=a
當前最大回文半徑R=2
當前中心位置flag=1
當前最大半徑r=2
=============================
當前循環到i=2
當前元素為=#
當前最大回文半徑R=2
當前中心位置flag=2
當前最大半徑r=2
=============================
當前循環到i=3
當前元素為=b
當前最大回文半徑R=6
當前中心位置flag=3
當前最大半徑r=4
=============================
當前循環到i=4
當前元素為=#
當前最大回文半徑R=6
當前中心位置flag=3
當前最大半徑r=4
=============================
當前循環到i=5
當前元素為=a
當前最大回文半徑R=6
當前中心位置flag=5
當前最大半徑r=4
=============================
當前循環到i=6
當前元素為=#
當前最大回文半徑R=12
當前中心位置flag=6
當前最大半徑r=7
=============================
當前循環到i=7
當前元素為=a
當前最大回文半徑R=12
當前中心位置flag=6
當前最大半徑r=7
=============================
當前循環到i=8
當前元素為=#
當前最大回文半徑R=12
當前中心位置flag=6
當前最大半徑r=7
=============================
當前循環到i=9
當前元素為=b
當前最大回文半徑R=12
當前中心位置flag=9
當前最大半徑r=7
=============================
當前循環到i=10
當前元素為=#
當前最大回文半徑R=12
當前中心位置flag=9
當前最大半徑r=7
=============================
當前循環到i=11
當前元素為=a
當前最大回文半徑R=12
當前中心位置flag=11
當前最大半徑r=7
=============================
當前循環到i=12
當前元素為=#
當前最大回文半徑R=12
當前中心位置flag=12
當前最大半徑r=7
=============================
6