字串演算法 馬拉車演算法

2021-09-20 04:12:00 字數 738 閱讀 5830

參考部落格:

時間複雜度o(n

)o(n)

o(n)

可以求出乙個串中最長回文子串長度,回文子串個數,每個位置的最長回文子串長度。

char str: 輸入的字串。

char tmp: 預處理過後的字串。

int mx: 當前最長回文子串匹配的最右位置。

int po: 當前最長回文子串的中點位置。

int len[i]: 最長回文子串最右端離i的距離。

len[i]-1: 該回文串在原字串中的長度。

(len[i]-i)/2:該回文串在原字元中的起始位置。

預處理:開頭和末尾加乙個特殊字元防止越界,將原字串每個字元之間都插入#

計算len 。 如果 i < mx,j為i相對於po的對稱位置,且len[j] <= mx-i。那麼len[i] = len[j],否則i就需要重新匹配。

經過預處理之後,便只有奇數的回文子串,字串中的#其實就代表最長回文子串為偶數的情況,例如只考慮回文長度為4的aaaa,處理過後變成aa#aa,這裡的#其實就代表著aaaa這個回文子串。而正常的字元代表的是為奇數長度的回文子串。

Manacher演算法 馬拉車(麻雀) 字串回文

這個演算法。和原先學習的kmp都是處理字串的。只不過麻雀是專門針對回文串的。我是最近cf補題的時候碰到這個演算法的。特此記錄一下。說實話。原先學資料結構的時候學的kmp。現在應該完全忘光了把。啊哈哈。明天再補補。舉個例子 回文串分為奇回文和偶回文。奇回文的中心是中間的字元。偶回文的中心是兩個字元中間...

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

作為乙個字串渣渣,對於我來說,看見此類問題總會忍不住虎軀一震。初次見到 求最長回文串 問題時,我腦子裡無非蹦出兩個想法 1.用棧的結構來儲存,然後出棧看是否滿足回文串的條件 回文串定義相信大家都知道,在此就不囉嗦了 2.看見最長,立馬想到用動態規劃的思想,寫出狀態轉移方程,找出最優子結構。其實這兩個...

馬拉車演算法

思路筆記 上述情況1和情況2又可以歸結為 i 的回文半徑 和 r i的距離 中小的那個就是i的回文半徑。include include includeusing namespace std string manacherstring string str return res int min int...