国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

字符串應(yīng)用之最長(zhǎng)回文串

2019-11-11 02:46:08
字體:
供稿:網(wǎng)友

以前做過一個(gè)方法就是從中間往兩頭擴(kuò)展。manacher算法是對(duì)這種算法的優(yōu)化。

比如字符串是FGFXXAXXFGF,在以A為中心的回文串中,還包含F(xiàn)GF這樣回文串,那么當(dāng)我們計(jì)算右邊的FGF時(shí),可以利用左邊FGF的信息,因?yàn)樗麄兪菍?duì)稱的,這就是Manacher算法的思想。

另外考慮奇數(shù)和偶數(shù)的不同情況,預(yù)先對(duì)字符串進(jìn)行預(yù)處理,每隔一個(gè)字符插入一個(gè)“#”,那么原字符假如是ABA將變成#A#B#A#,原字符是AB將變成#A#B#,不論原來奇偶,都將成為奇數(shù),方便計(jì)算。

說明,P[i]表示以s[i]為中心可以向右或者向左擴(kuò)展的才長(zhǎng)度,比如ABA,P[0]=1 P[1]=2 P[2]=1

class Solution {PRivate: void Manacher(string &s, vector<int>&P) { int size = s.size(); P[0] = 1; int id = 0; int mx = 0; for (int i = 1; i < size; ++i) { if (mx > i) { P[i] = min(P[2 * id - i], mx - i); } else { P[i] = 1; } while (i - P[i] > -1) { if (s[i + P[i]] == s[i - P[i]]) P[i]++; else break; } if (mx < i + P[i]) { mx = i + P[i]; id = i; } } }public: string longestPalindrome(string s) { int size = s.size(); string copied("#"); for (int i = 0; i < size; ++i) { copied += s[i]; copied += "#"; } vector<int>P(copied.size()); Manacher(copied, P); int pos = 0; int mx = P[0]; string res; for (int i = 1; i<P.size(); ++i) { if (P[i]>mx) { mx = P[i]; pos = i; } } for (int i = pos-mx+1; i < mx + pos; ++i) { if(copied[i]!='#') res += copied[i]; } return res; }};
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 上杭县| 无为县| 济阳县| 区。| 万全县| 建平县| 双桥区| 马边| 娄烦县| 苏尼特右旗| 景泰县| 青阳县| 广安市| 金沙县| 建水县| 渑池县| 富平县| 裕民县| 阳城县| 海原县| 靖安县| 通州区| 修武县| 关岭| 南陵县| 汕尾市| 宁陕县| 临泽县| 康乐县| 嘉峪关市| 阜康市| 大连市| 日土县| 巴南区| 牡丹江市| 雷州市| 保德县| 姜堰市| 雷波县| 拉孜县| 灵武市|