manacher是一種線性時間複雜度演算法,對於給定的字串s, 可以在o(n)時間內,求出以每個位置為中心的最長回文子串。
插入無關字元
在相鄰字元之間以及字串首尾分別插入s中沒出現的字元,設為#,得到str。則str中以任意位置為中心的最長回文串長度是奇數。記 p
[i]=
max。
因此只要求出p陣列即可。
假設從左向右掃瞄,當前在i點,定義
id=a
rgma
xj分兩種情況:
1. i < id + p[id], 這時找 i關於id的對稱點id*2-i,根據該點p值更新i點;
2. i >= id + p[id], 暴力求解i點p值
因為每次比較都是在增加id+p[id]的值,顯然id+p[id]上限是字串長度,因此複雜度o(n)。
class solution ;
int p[s.length()*2+5] = ;
int len = 0;
st[len++] = '%';
for (int i = 0; i < s.length(); ++i)
st[len++] = '#'; st[len] = '\0';
p[0] = 0;
int ans = 0;
for (int id = 0, i = 1; i < len - 1; ++i)
return s.substr((ans - p[ans])/2, p[ans]-1);
}};
Manacher演算法 求字串中最長回文串
manacher演算法在對求字串中最長回文串問題中,具有o n 時間和空間複雜度。演算法的精妙之處在於巧妙的利用了回文串的對偶性質。第一步 對字元間新增間隔符,例如,字串aababcdab,通過新增間隔符轉化為 a a b a b c d a b 從而避免了字串的奇偶性問題,為了避免演算法中考慮邊界...
字串的最長回文子串 manacher演算法
字串概念 回文子串概念 通常我們熟知的求解字串的最長回文字串的方法有以下兩種演算法 1 o n 2 列舉子串的左右兩個端點 o n 判斷該子串是否為回文串 總複雜度o n 3 2 o n 列舉每乙個回文子串的中點 偶數長度類似,不做討論 o n 向兩端拓展 總複雜度o n 2 如果將上述演算法2視為...
字串專題小結 Manacher演算法求最長回文串
資料 網路 參見 有改動 這道題是一道經典的manacher演算法講解題目,manacher是時間複雜度為o n 的演算法。比起蠻力法 對於o n 的每乙個點,都掃瞄該點的左右對稱點,這種方法效率顯然是o n 2 的 演算法巧妙之處 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子串都轉...