#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdlib>
#include <map>
#include <vector>
using namespace std;
const int maxn=300007;
char str[maxn];
int p[maxn<<1];
void manacher(char *s){ //求p数组
int len=strlen(s);
for(int i=len;i>=0;--i){
s[i+i+2]=s[i];
s[i+i+1]='#'; //如果字符串中有*和#,代码中需要替换符号
}
s[0]='*';
int k=1,maxlen=0;
for(int i=2;i<len+len+1;++i){
int maxr=k+p[k]-1;
p[i]=min(p[2*k-i],max(maxr-i+1,1));
while(s[i-p[i]] == s[i+p[i]])++p[i];
if(i+p[i]>k+p[k])k=i;
if(p[i]>maxlen)maxlen=p[i];
}
}
int getLongestPalindrome(char *s){ //得到p数组后,返回最长回文长度
Manacher算法求回文子串
最新推荐文章于 2021-11-05 19:29:07 发布
本文介绍Manacher算法实现求解字符串中最长回文子串的方法,通过构造新串并维护辅助数组P,高效找出以每个字符为中心的最长回文串。在示例中,给出了一段代码实现并解释了算法的关键步骤和性质。
摘要由CSDN通过智能技术生成