首页 > 代码库 > [算法]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; } } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。