首页 > 代码库 > [算法]manachar最长回文子串

[算法]manachar最长回文子串

现给定一个已知的字符串str[],现在想要在O(n)的时间复杂度之内求出一个最长的回文子字符串(正着和倒着顺序读一致)。

Manacher最早发现了可以用O(n)的时间复杂度来解决该问题,所以这种方法称之为Manacher算法。

#include <iostream>using namespace std;int min(int a, int b){    return a > b ? b : a;}char* preproccess(char* src, char* des){    int j = 0;        des[j++] = $;    des[j++] = #;    for(int i = 0; 0 != src[i]; ++i){        des[j++] = src[i];        des[j++] = #;    }    des[j] = 0;    return des;}void manachar(char* str,int* p){    int mx = 0, id;    p[0] = 0;    for(int i = 1; 0 != str[i]; ++i){        if(mx > i){            p[i] = min(mx - i, p[2*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;        }    } }