[算法]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;
        }
    } 
}

 

你可能感兴趣的:(char)