JAVA求回文數


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的思想也是避免"匹配"失敗后的下標回退

下面正式開始分析算法
首先,我們需要了解一個叫做回文半徑的東西

https://blog.csdn.net/bestsort/article/details/81637464
============================================================================================
看了很多其他博主的博文,沒有把最大回文序列R將清楚,R存在的意義到底是什么?
 
找了別人的代碼改了一下查看abaaba的Mancher的運算過程
 String str = "abaaba";

當前循環到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM