manacher演算法處理最長的回文子串(二)

2022-02-03 09:33:02 字數 1082 閱讀 2926

在上篇《manacher演算法處理最長的回文子串(一)》解釋了manacher演算法的原理,接著給該演算法,該程式在leetcode的最長回文子串中通過。首先manacher演算法維護3個變數。乙個名為radius[i]的陣列,表示以i為中心軸承的回文子串的半徑,如abcdcba中,字元d的下標為4,則他的radius[4]=3,下標的為0的a的半徑為radius[0]=0,即中心軸不考慮其中。乙個idx表示上一次以idx為中心軸的回文。如果當以i為中心的回文在以idx為中心的回文內。則idx不更新,否則處理完radius[i]後,需要把idx更新為i。最後乙個rad維護idx能夠包含最大的範圍的下乙個字元下標,事實上當i+radius[i]到到達rad時就需要更新idx。

**:

1

class

solution else17}

18 vector radius(2*n+1,0

);19

int idx=0;20

int rad=1;21

for(int i=1;i<2*n+1;i++)else

if(i32else

if(j_radius45 maxidx=(radius[i]>radius[maxidx]?i:maxidx);46}

4748}49

string ret=getmaxsubstring(str,maxidx,radius[maxidx]);

50return

ret;51}

52void forceextend(const

string& str, vector& radius,int &idx,int &rad,const

intk)

57 radius[k]=count-1;58

if(k+radius[k]>=rad)62}

63string getmaxsubstring(const

string &str,const

int k,const

intr)

69return

ret;70}

7172 };

Manacher最長回文串演算法

在介紹演算法之前,首先介紹一下什麼是回文串,所謂回文串,簡單來說就是正著讀和反著讀都是一樣的字串,比如abba,noon等等,乙個字串的最長回文子串即為這個字串的子串中,是回文串的最長的那個。一.通常解決的問題 給定乙個字串,求出其最長回文子串。例如 1 s abcd 最長回文長度為 1 2 s a...

manacher演算法(最長回文串)

題目解釋 子串 小於等於原字串長度由原字串中任意個連續字元組成的子串行 回文 關於中間字元對稱的文法,即 aba 單核 cabbac 雙核 等 最長回文子串 1.尋找回文子串 2.該子串是回文子串中長度最長的。首先要知道這個演算法是用來在o n 的時間裡看乙個字串的最長回文子串的長度是什麼。其次,它...

Manacher演算法 最長回文串

若字串長度為n,則演算法的時間複雜度為o n 假設有乙個字串abaaba 先把該字串變成 a b a a b a 第乙個字元設為 防止計算的時候陣列越界 再計算p陣列,先給出p陣列的答案 i為座標,ma陣列放改變後的字串,p陣列代表以該字元為中心,向右和向左延伸p i 個,是回文串 i 0 1 2 ...