关于KMP算法中,获取next数组算法的理解

参考:KMP入门级别算法详解--终于解决了(next数组详解)算法

https://blog.csdn.net/lee18254290736/article/details/77278769数组

在这里讨论的next数组的含义为模式串p[j]以前前缀和后缀相等的个数,若都不相等则为0。(特殊状况,没有前缀和后缀时,则为-1,如next[0]=-1;当j==1时,p[1]前面只有一个字符,在这里认为next[1]=0).net

如下是计算next数组算法的代码:blog

void getNext(char *p, int *next)
{
	int j=0, k=-1;
	next[0] = -1; 
	while (j<strlen(p) - 1)
	{
		if (k == -1 || p[j] == p[k])     
		{
			++j;  ++k;
			next[j] = k;
		}
		else                      
			k = next[k];
	}
}

对以上代码的解析:字符串

首先,k 始终表明着模式串中当前j对应的p[j]以前前缀和后缀相等的个数,所以p[j] == p[k]时get

 

++j;  ++k;
next[j] = k;

当p[j] != p[k],则入门

 

k = next[k];

此时k 依然表明着模式串中当前j对应的p[j]以前前缀和后缀相等的个数,只不过个数变少了,例如p[j]以前的字符串为acac.....acac,p[j]以前前缀和后缀相等的个数为4,则k=next[4]=2,则可视为ac.........ac。当p[j]仍是不等于p[k]时,再次执行class

k = next[k];

直至它们相等,或k==-1。当k==-1时,一定执行if语句中的代码,使得当前next[j]=0。next

以上就是对获取next数组算法的理解。while

配合如下代码实现KMP算法:

int kmp(char* W,char* T,int* next){
	int i = 0, j = 0;
	while (i<strlen(T)){
		while (j != -1 && W[j] != T[i]){ j = next[j]; }
		if (j == strlen(W)-1){
			return i - strlen(W) + 1;
		}
		else{
			j++;
			i++;
		}
	}
	return -1;
}
相关文章
相关标签/搜索