給定乙個字串,求出其的最長回文子串;
乙個將時間複雜度優化到o(n)的演算法;
暴力演算法,但不是純暴力,即按照做過的事情不再去做來優化;
我們知道,乙個回文串要麼是奇數的串:aba ,, 要麼是偶數的串:abba;
可以看出,乙個回文串有乙個對稱軸;
對於奇數串aba來說,對稱軸就是b;
而對於偶數串abba來說,對稱軸在abba的兩個b之間,可我們又沒有儲存這兩個b之間的那個位置;怎麼辦呢:
於是我們將讀入的字串進行如下處理:
s=aba 那麼 str=$ #a#b#a#
s=abba 那麼 str=$ #a#b#b#a#
在每兩個單詞間插入乙個#號,$是乙個邊界;
#include
using
namespace std;
#define maxn 11000010
char s[maxn]
,str[maxn<<1]
;int len[maxn<<1]
,len1,len2;
inline
void
clean_()
inline
void
init_()
str[k++]=
'#';
len2=k;
}inline
intmanacher_()
}return
(sum-1)
;}intmain()
Manacher演算法(馬拉車)
演算法總結第三彈 manacher演算法,前面講了兩個字串相演算法 kmp和拓展kmp,這次來還是來總結乙個字串演算法,manacher演算法,我習慣叫他 馬拉車 演算法。相對於前面介紹的兩個演算法,manacher演算法的應用範圍要狹窄得多,但是它的思想和拓展kmp演算法有很多共通支出,所以在這裡...
馬拉車演算法manacher
1.預處理解決奇回文和偶回文問題 比如 str bcbaa 在每個字元的開頭,結尾和中間插入乙個特殊字元 來得到乙個新的字串 b c b a a 這樣對於原來字串中的奇回文 bcb 來說,在新的字串中變成了 b c b 還是奇回文,只是回文串長度從3變成了7 注意 中 i 1 0,與1按位與,如果i...
Manacher演算法 馬拉車
於 馬拉車的解決的問題 給定字串s,求s中的最長回文子串?解釋 回文串就是正讀反讀都一樣的字串,比如奇回文串 bab 偶回文串 noon 馬拉車演算法步驟 index01 2345 6789 1011 1213 char 1 2 2 1 2 2 r121 2521 6123 21規律 最大半徑減1等...