现给定一个已知的字符串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; } } }
[算法]manachar最长回文子串,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/zhengyuhong/p/3817158.html