最長回文字串 MANACHER演算法

2021-08-07 16:09:51 字數 741 閱讀 1027

個人感覺馬拉車演算法的思想和擴充套件kmp的思想是相似的。

首先對於這個問題,我們可以暴力列舉每個子串,然後判斷是否是回文串,時間複雜度大概是o(n^3),我們運用下尺取法的思想,列舉每乙個對稱軸位置(針對長度的奇偶有所區別),那麼時間複雜度會是o(n^2),接著我們如果把字串轉化一下,新增一些未出現過的字元,形成乙個長度為奇數的字串。那麼我們只用列舉每乙個長度然後判斷就好了。所以如何利用已經得到的資訊判斷最長就是乙個優化點。

我們用pos,maxright記錄最大回文半徑,以pos為對稱軸,maxright為最大右邊的位置,len[i]表示以i為對稱軸的回文半徑長

對於當前的i,可能有兩種情況:(首先一定在pos的右邊)

1 i在maxright左邊

此時i關於pos的對稱位置為j, 那麼此時關於i為對稱軸,已經形成回文串的位置有min(len[j],maxright-i)

2 i在maxright的右邊

此時就需要從頭開始進行匹配。

int init(char *s)//將原字串轉化為帶有特殊標誌的字串t

t[len*2+1]='#';

t[len*2+2]='$';//防止越界

return 2*len+1;

}int manacher(char *s,int lens)//按照馬拉車演算法的思想進行操作

ans=max(ans,len[i]);

} return ans-1;

}

最長回文字串(manacher演算法)

資料 網路 參見 問題描述 輸入乙個字串,求出其中最大的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。解析 這裡介紹o n 回文子串 manacher 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子...

O n 時間求 最長回文子串 Manacher演算法

回文字串分為奇回文和偶回文,在字串中間插入任意字元使得串變成奇回文串 暴力思想 肯定是找乙個點往兩邊任意擴充套件,遍歷一次,manacher時間為o n 開乙個陣列p記錄 以點i為中點 的最長回文串的半徑,假設前i 1個點的p都已經求出來來,現在考慮p i 如何推導 重點 r是p 1 p i 1 中...

Hdu 3068最長回文 Manacher演算法

這是一種能夠在將近o n 的時間裡求出給定字串的最長回文子串的演算法。首先我們知道字串的長度分奇偶,這對我們考慮問題影響很大,所以在給定字串的所有字元之間插入乙個無關字元 包括首尾 這樣對答案沒有什麼影響,而且字串的長度都變為n 2 1,是個奇數。然後定義乙個f陣列,f i 表示以i為中心向右 向左...