個人感覺馬拉車演算法的思想和擴充套件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為中心向右 向左...