manacher's algorithm尋找最長迴文子串
阿新 • • 發佈:2018-12-16
manacher’s algorithm尋找最長迴文子串
#include <vector> #include <iostream> #include <string> using namespace std; string Manacher(string s) { // Insert '#' string t = "$#"; for (int i = 0; i < s.size(); ++i) { t += s[i]; t += "#"; } // Process t vector<int> p(t.size(), 0); int
mx = 0, id = 0, resLen = 0, resCenter = 0; for (int i = 1; i < t.size(); ++i) { if(mx > i) { if(p[2 * id - i] < mx - i) //基於id對稱 p[i] = p[2 * id - i]; else //超過mx-i的部分,一個一個匹配 p[i] = mx - i; } else //i在mx的外邊,重新匹配 p[i] = 1; while (t[i + p[i]] == t[i - p[i]]) p[i]++; if (mx < i + p[i]) { mx = i + p[i]; id = i; } if (resLen < p[i]) { resLen = p[i]; resCenter = i; } } return s.substr((resCenter - resLen) / 2, resLen - 1); } int main() { string s1 = "Is PAT&TAP symmetric?"; cout << Manacher(s1) << endl; }