字串演算法manacher演算法

2021-07-24 23:34:42 字數 781 閱讀 1872

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 的 演算法巧妙之處 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子串都轉...