若字串長度為n,則演算法的時間複雜度為o(n)
假設有乙個字串abaaba
先把該字串變成$ # a # b # a # a # b # a #
第乙個字元設為『$』,防止計算的時候陣列越界
再計算p陣列,先給出p陣列的答案
i為座標,ma陣列放改變後的字串,p陣列代表以該字元為中心,向右和向左延伸p[i]個,是回文串
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13
ma $ # a # b # a # a # b # a #
p 1 1 2 1 4 1 2 7 2 1 4 1 2 1
附上完整**
1 #include 23using
namespace
std;
45 typedef long
long
ll;6
const
int maxn = 110000;7
char ma[maxn*2];8
int p[maxn*2];9
10void manacher(char *s,int
len)
18 ma[l] = 0;19
int mx = 0,id = 0;20
for(int i = 0; i < l; i++) 27}
28}29int
main()
42return0;
43 }
下列這圖是盜用別人的,這張圖很好詮釋了p[i] = mx > i ? min(p[2*id - i],mx - i) : 1;
j = 2*id - 1; p[j] 已經算出來了,又因為id向左向右延伸mx都是回文的,所以p[i] == p[j] (在滿足小於 mx - i 的情況下)
Manacher最長回文串演算法
在介紹演算法之前,首先介紹一下什麼是回文串,所謂回文串,簡單來說就是正著讀和反著讀都是一樣的字串,比如abba,noon等等,乙個字串的最長回文子串即為這個字串的子串中,是回文串的最長的那個。一.通常解決的問題 給定乙個字串,求出其最長回文子串。例如 1 s abcd 最長回文長度為 1 2 s a...
manacher演算法(最長回文串)
題目解釋 子串 小於等於原字串長度由原字串中任意個連續字元組成的子串行 回文 關於中間字元對稱的文法,即 aba 單核 cabbac 雙核 等 最長回文子串 1.尋找回文子串 2.該子串是回文子串中長度最長的。首先要知道這個演算法是用來在o n 的時間裡看乙個字串的最長回文子串的長度是什麼。其次,它...
最長回文字串(manacher演算法)
資料 網路 參見 問題描述 輸入乙個字串,求出其中最大的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。解析 這裡介紹o n 回文子串 manacher 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子...