Manacher算法

具体算法思想参考大佬的文章,比较详细

https://subetter.com/algorithm/manacher-algorithm.html?tdsourcetag=s_pctim_aiomsg

我在代码的基础上做了稍微修改,可以返回最大回文子串的长度,也可以返回最大回文子串。

代码:

#include<bits/stdc++.h>
using namespace std;
string Init(string a)//给字符串a加上#,首字符加上$ 
{
    string s = "$";
    s += '#';
    for(int i = 0;i < a.length();i++)
    {
        s += a[i];
        s += '#';    
    }    
    return s;

string Manacher(string a)
{
    string s = Init(a);
    vector<int> p(s.length());
    int max_len = -1;//维护最长的回文子串长度 
    int id = 0;
    int mx = 0;
    for(int i = 1; i < s.length();i++)
    {
        if(i < mx)
            p[i] = min(p[2*id-i],mx-i);
        else
            p[i] = 1;
        while(s[i-p[i]] == s[i+p[i]])
            p[i]++;
        if(mx < i + p[i])
        {
            id = i;
            mx = i + p[i];
        }
        max_len = max(max_len,p[i]-1);
    }
    id = 0;
    for(int i = 1;i < s.length();i++) //找到最大回文子串的中心位置 
        if(p[i] > p[id])
            id = i;
    mx = id + p[id];         
    string result = "";
    for(int i = 2*id-mx+1;i < mx;i++)
    {
        if(s[i] != '#')
            result += s[i];
    }
    return result;
}
int main()
{
    string a;
    cin>>a;
    if(a.length() <= 1)
        cout<<a<<endl;
    else
        cout<<Manacher(a)<<endl;
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值