求回文子串O(n)manacher算法_第1頁
求回文子串O(n)manacher算法_第2頁
求回文子串O(n)manacher算法_第3頁
求回文子串O(n)manacher算法_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、求回文子串 0(n) manacher 算法回文串定義:"回文串”是一個正讀和反讀都一樣的字符串,比如"level ”或者"noon ”等等就是回文串。回文子串,顧名思義,即字符串中滿足回文性質的子串。經常有一些題目圍繞回文子串進行討論,比如HDOJ_3068_最長回文,求最長回文子串的長度。樸素算法是依次以每一個字符為中心向兩側進行擴展,顯然這個復雜度是 O(N2)的,關于字符串的題目常用的算法有KMP、后綴數組、AC自動機,這道題目利用擴展 KMP可以解答,其時間復雜度也很快O(N*logN)。但是,今天筆者介紹一個專門針對回文子串的算法,其時間復雜度為O(n

2、),這就是manacher算法。大家都知道,求回文串時需要判斷其奇偶性,也就是求aba和abba的算法略有差距。然而,這個算法做了一個簡單的處理,很巧妙地把奇數長度回文串與偶數長度回文串統一考慮,也就是在每個相鄰的字符之間插入一個分隔符,串的首尾也要加,當然這個分隔符不能再原串中出現,一般可以用# '或者$'等字符。例如:原串:abaab新串:#a#b#a#a#b#這樣一來,原來的奇數長度回文串還是奇數長度,偶數長度的也變成以# '為中心的奇數回文串了。接下來就是算法的中心思想,用一個輔助數組P記錄以每個字符為中心的最長回文半徑,也就是Pi記錄以Stri字符為中心的最長

3、回文串半徑。Pi最小為1,此時回文串為Stri 本身。新串: #a#b#a#a#b#P:12141252121我們可以證明Pi-1就是以Stri為中心的回文串在原串當中的長度。證明:1、顯然L=2*Pi-1 即為新串中以Stri為中心最長回文串長度。2、 以Stri為中心的回文串一定是以 #開頭和結尾的,例如“ #b#b# ”或“#b#a#b# ” 所以L減去最前或者最后的 # '字符就是原串中長度的二倍,即原串長度為 (L-1)/2,化簡 的Pi-1。得證。依次從前往后求得P數組就可以了,這里用到了DP(動態規劃)的思想,也就是求Pi的時候,前面的P值已經得到了,我們利用回文串的特殊

4、性質可以進行一個大大的優化。我先把核心代碼貼上:for (i= 1 ;i<n ;i+)if (MaxId>i)pi=Mi n(p2*id-i,MaxId-i);elsepi=1 ;while (ai+pi=:=ai-pi)pi+;if (pi+i>MaxId)Maxld=pi+i;id=i;retur na<b?a:b;殊字符,令P0= $ '最后位置默認為 0 '不需要特殊處理。此外,我們用Maxld變量記錄在求i之前的回文串中,延伸至最右端的位置,同時用 id記錄取這個 Maxld的id值。通過下面這句話,算法避免了很多沒必要的重復匹配。if (Ma

5、xld>i)pi=Mi n(p2*id-i,Maxld-i);那么這句話是怎么得來的呢,其實就是利用了回文串的對稱性,如下圖,idi Maxldretur na<b?a:b;retur na<b?a:b;j=2*id-i即為i關于id的對稱點,根據對稱性,Pj的回文串也是可以對稱到i這邊的,但是如果Pj的回文串對稱過來以后超過Maxld的話,超出部分就不能對稱過來了,如下圖,所以這里Pi為的下限為兩者中的較小者,pi=Min(p2*id-i,Maxld-i)。i Maxld算法的有效比較次數為Maxld次,所以說這個算法的時間復雜度為0(n)。附HDOJ 3068 最長回文

6、代碼:#i nclude <stdio.h>#defi ne M 110010char bM,aM<<1;intintpM<< 1 ;Min( int a, intb)1intmai n()int i,n ,id,MaxL,Maxld; while (scanf( "%s" ,&b1)!=EOF)MaxL=MaxId=0;for (i= 1 ;bi!='0'i+)a(i<<1 )=bi;a(i<<1)+ 1 = '#'a0='?'a 1= '#'n=(i<<1)+ 2;a n=0;Maxld=MaxL= 0;for (i= 1 ;i<n;i+)if (MaxId>i) Ipi=Mi n(p2*id-i,Maxld-i);elsepi=1 ;while (ai+pi=ai-pi)pi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論