manacher算法解释

it2022-05-05  163

 

 

 

 

 

 

代码解释:

源码:

#include<iostream> #include<string> #include<algorithm> #include<limits> using namespace std; //在字符串之间插入字符,从而 奇偶回文串都能识别 char* manacherString(string str){ int length = str.size(); char* res = new char[2*length + 1]; int index = 0; for(int i=0;i<2*length + 1; i++){ res[i] = (i&1) == 0? '#' : str[index++]; } return res; } int maxLcpsLength(string str){ if(str.size() == 0) return 0; char* charArr = manacherString(str); int* pArr = new int[str.size()]; int C = -1; int R = -1; int MAX = INT_MIN; for(int i=0;i<2*str.size()+1;i++){ //pArr 可以有一个直接填的值,根据1.2.3.4的情况,填完后,我在看看能不能往外扩展 // 对于2.3两种情况,一扩展直接失败, 对于1.4.情况,while继续扩展是有可能增加pArr值的 pArr[i] = R > i? min(pArr[2*C - i], R-i) : 1; // 保证所比较的两个位置都在区间内,则允许两个位置的字符进行比较 while(i+pArr[i] < (2*str.size()+1) && i - pArr[i] > -1){ //如果当前外扩的两个字符相等,则i位置的值+1, 再取判断 左右又外扩一位的两个字符是否相等 if(charArr[i+pArr[i]] == charArr[i-pArr[i]]){ pArr[i]++; }else{ break; } } //更新 最大回文右边界 R, 和回文中心C 的位置 if(i+pArr[i] > R){ R = i+pArr[i]; C = i; } //每次在pArr中填完值后,更新MAX MAX = max(MAX,pArr[i]); } return MAX-1; } int main(){ cout <<"max: "<< maxLcpsLength("1abcba111"); return 0; }

ok?


最新回复(0)