在上篇《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。
**:
1class
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 ...