KMP算法的思想以及代码的实现

KMP算法用于快速进行字符串匹配,它是基于BF算法的一种优化,能极大提高匹配的时间复杂度。
它的思想主要是在进行BF算法的基础上,当i位置与j位置的字符不匹配时,令i不回退,而j回退到k的位置,如下图
KMP算法的思想以及代码的实现_第1张图片
而KMP的核心,就是寻找这个k的位置,在串中存在两个 相等的真子串,其中一个串是以0位置开始,另一个以j-1位置结束,这个k的位置就应该在以0位置开始的子串的下一个位置,k的值等于真子串的长度。
这里引入一个next数组,来存储k的值,next数组的前两个元素分别为-1,0,因为单个元素不存在子川的匹配,而-1是为了方便后面的判定,如果P数组中,k位置与i位置的元素相等,那么next数组中i+1位置的元素便为k+1;如果不相等,那么k等于next中k位置的元素。
下面是简单的代码实现:

void Getnext(int *next, char *p, int plen)
{
	next[0] = -1;
	next[1] = 0;
	int k = -1;
	for (int j = 0;j < plen;j++)
	{
		while (p[k + 1] != p[j + 1])
		{
			k = next[k];
		}
		if (p[k + 1] == p[j + 1])
		{
			k = k + 1;
		}
		next[j + 1] = k;
	}
}
int KMP(char *s, int slen, char *p, int plen)
{
	int *next = (int *)malloc(sizeof(plen) + 1);
	memset(next, 0, plen);
	Getnext(next, p, plen);
	int k = -1;
	for (int i = 0;i < slen;i++)
	{
		while (k > -1 && p[k + 1] != s[i])
		{
			k = next[k];
		}
		if (p[k + 1] == s[i])
		{
			k++;
		}
		if (k == plen - 1)
		{
			return i - plen + 1;
		}
	}
}

你可能感兴趣的:(KMP算法的思想以及代码的实现)