manacher算法解释

 

manacher算法解释_第1张图片

manacher算法解释_第2张图片

 

manacher算法解释_第3张图片

manacher算法解释_第4张图片

manacher算法解释_第5张图片

 

 

manacher算法解释_第6张图片

 

manacher算法解释_第7张图片

manacher算法解释_第8张图片

 

代码解释:

manacher算法解释_第9张图片

源码:

#include
#include
#include
#include
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?

你可能感兴趣的:(左神进阶班代码,leetcode刷题心得)