參考部落格:
時間複雜度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...