1. 程式人生 > >Manacher演算法解決最長迴文子串問題---O(n)時間複雜度

Manacher演算法解決最長迴文子串問題---O(n)時間複雜度

#include <iostream>
#include <string.h>
using namespace std;

void Manacher(char *src)
{
    char *str = new char[2*strlen(src)+3];
    str[0] = '$';
    int i = 1;
    while(*src != '\0')
    {
        str[i++] = '#';
        str[i++] =*src++;
    }
    str[i++] = '#';
    str[i] = '\0';

    int len = i;
    int mx=0,id;
    int p[len];
    for(i=1; i<len; ++i)
    {
        if(mx > i)
        {
            p[i] = min(p[2*id-i], p[id]+id-i);
        }
        else
        {
            p[i] = 1;
        }
        while(str[i+p[i]] == str[i-p[i]])
        {
            p[i]++;
        }
        if(p[i]+i > mx)
        {
            mx = p[i]+i;
            id = i;
        }
    }
    for(i=1; i<len; ++i)
    {
        cout<<p[i]<<" ";
    }
    delete[] str;
}

int main()
{
    cout<<"please input a string:"<<endl;
    char *s=new char;
    cin>>s;
    Manacher(s);
    return 0;
}