manacher's algorithm寻找最长回文子串

manacher’s algorithm寻找最长回文子串

#include 
#include 
#include 

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;
}

在这里插入图片描述

你可能感兴趣的:(算法)