Manacher算法 with c++

今天看Design of Computer Programs的时候突然出现了最长回文子字符串问题..顺便就研究了一下Manacher算法.
求证的话别的博客有,我觉得关键就是两点,一个是将字符串经过处理,消除奇偶的影响,在一个就是构造p[i],为每一个i对应的回问字串长度,然后用p[i]之前的p[i-1]推出p[i]的值来,简化计算过程,降低复杂度为O(n).
贴个链接..

http://blog.csdn.net/dyx404514/article/details/42061017

#include <iostream>
#include <string>


using namespace std;

void  MANACHER(string& str)
{
    int *p = new int[str.size() + 1];
    memset(p, 0, sizeof(p));

    int mx = 0, id = 0;
    for(int i = 1; i <=  str.size(); i++)
    {
        if(mx > i)
        {
            p[i] = min(p[2*id - i] , (mx - i) );
        }
        else
        {
            p[i] = 1;
        }

        while(str[i - p[i]] == str[i + p[i]])
            p[i]++;

        if(i + p[i] > mx)
        {
            mx = i + p[i];
            id = i;
        }

    }
    int max = 0, ii;
    for(int i = 1; i < str.size(); i++)
    {
        if(p[i] > max)
        {
            ii = i;
            max = p[i];
        }
    }

    max--;

    int start = ii - max ;
    int end = ii + max;
    for(int i = start; i <= end; i++)
    {
        if(str[i] != '#')
        {
            cout << str[i];
        }
    }
    cout << endl;

    delete  p;
}

int main()
{
    string str = "";
    string strs;
    strs += "$#";
    for(int i = 0; i < str.size(); i++)
    {
        strs += str[i];
        strs += "#";
    }

    MANACHER(strs);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值