字串 馬拉車演算法(求最長回文串)

2021-09-29 22:01:02 字數 1891 閱讀 7791

作為乙個字串渣渣,對於我來說,看見此類問題總會忍不住虎軀一震。。。初次見到「求最長回文串」問題時,我腦子裡無非蹦出兩個想法:

1.用棧的結構來儲存,然後出棧看是否滿足回文串的條件(回文串定義相信大家都知道,在此就不囉嗦了);

2.看見最長,立馬想到用動態規劃的思想,寫出狀態轉移方程,找出最優子結構。

其實這兩個思路合併起來是否可以解決問題——答案是肯定的。但這樣一來的時間複雜度和空間複雜度都是很大的(時間複雜度

**實現

總結kmp演算法作為《資料結構》——串一章中,最重要的乙個演算法,想必大部分人都不陌生。同樣的,這也是字串問題中乙個經典的將時間複雜度大大優化的經典演算法。

我們先來回顧一下,kmp演算法的核心是什麼——找出待匹配的子串的最長公共字首,一次確立next陣列,作為對位失敗後下次移位的基準。

所以說,欲解決當前字串與其他字串的問題,須先從自身下手——這也正是馬拉車演算法的方**。

首先我們都知道,回文串有兩種情況:

(1)串長為基數:如abcba,該串以c為中心點作回文分界;

(2)串長為偶數:如abccba,中心點為兩個字元的分界。

針對這兩種情況,為實現統一,先在串中每個字元間(首尾端都要插入)插入乙個不衝突的特殊符號作為,例如:

原串為abbba,插入乙個特殊符號#後變為a#b#b#b#a#

這樣做的目的是:插入後字串長度肯定為奇數了(奇+偶=奇),這樣做之後就肯定不用考慮串的奇偶性了

接下來我們與kmp的next陣列一樣,引入乙個概念:半徑陣列

這個陣列p[i]用於記錄以s[i]為中心的最長回文串的半徑(不包括p[i]本身)。當p[i]=0時,說明回文串是字串本身。

比如,#a#b#的半徑陣列為

仔細體會一下,最大半徑是不是就是最大回文串的半徑?

這時我們還需注意的一點是:回文串搜尋時我們需避免越界的問題。因此還要在已經處理過一遍的字串外頭尾加上兩個特殊符號,例如:

#a#b#變為$#a#b#*

至於為什麼計算的是半徑,在於為了方便計算邊界。

傳統的o(n

2)

o(n^2)

o(n2

)的做法,是以中心店開始,挨個將半徑擴張,這麼一來時間複雜度就很高,因為既要遍歷、又要比對;

而馬拉車演算法巧妙的借用了p[i]陣列,一直不斷更新兩個變數:

(1)id:回文串的中心位置;

(2)mx:回文串的最後位置;

p[i]=min(mx-i,p[2 id-i])

想想,為什麼p[i]會如此定義?

(1)當遍歷時一直都符合回文,mx-i為最壞情況下p[i]的最大值;而2id-i則為,當mx-i>p[i]時,由於對稱性,2id-i和i肯定是對稱的,所以以s[i]為中心的回文子串必包含在以s[id]為中心的回文子串中。

此處指給出核心**。並沒有使用p陣列表示,但思路一致

const maxn=

10005

;const

int mx=

0,id=0;

intmin

(int

&x,int

&y)int

max(

int&x,

&y)int

manacher

(char str,

int mx,

int id)

}return

(sum-1;

}

馬拉車演算法與kmp演算法類似,需要先對字串內部自身進行比較,且設定乙個輔助陣列。雖然說相比傳統的動態規劃方法,節省了時間開銷,但在半徑陣列的求值問題中也用到了dp思想。當然,半徑陣列的設定也不是必要的。還有一點須注意的是,由於回文串存在奇偶性,應先對字串進行預處理。

最長回文串(馬拉車演算法)

最長回文子串 manacher演算法 馬拉車演算法 馬拉車演算法需要計算以每個字元為中心的回文串半徑。並記錄最右邊界 馬拉車演算法基於這樣乙個事實,從回文串的中心到兩邊是對稱的,意味著以兩邊對稱的字元為中心的回文串半徑相等 在不超過最右邊界的情況下,如果超出就需要擴充套件搜尋 public stri...

最長回文串 馬拉車演算法

有兩個長度均為n的字串a和b。可以從a中選乙個可以為空的子串a l1 r1 b中選乙個可以為空的子串b l2 r2 滿足r1 l2,然後把它們拼起來 a l1 r1 b l2 r2 求用這樣的方法能得到的最長回文串的長度。注意 求的不是本質不同的回文串個數哦!解題報告 找兩個之間的最長回文串,只不過...

馬拉車(求最長回文字串)

參考 時間複雜度 o 要分奇數子字串與偶數子字串 時間複雜度 o string findlongest string s return s.substr start,end start 1 int expand string s,int left,int right return r l 1 不用分...