KMP算法

Posted kirosola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP算法相关的知识,希望对你有一定的参考价值。

typedef struct {
	char str[MAX];
	int length;
}SString;

  BF算法

int Index(SString *S, SString *T)
{
	int i, j;
	i = 1; j = 1;
	while (i<=S->length&&j<=T->length)
	{
		if (S->str[i] == T->str[j])
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 2;
			j = 1;
		}
	}
	if (j > T->length)
		return i - T->length;
	else
		return 0;
}

  KMP算法

int Index_KMP(SString *S, SString *T,int *next)
{
	int i = 1, j = 1;
	while (i <= S->length && j <= T->length)
	{
		if (j == 0 || S->str[i] == T->str[j])
		{
			i++;
			j++;
		}
		else
			j = next[j];
	}
	if (j > T->length)
		return i - T->length;
	else
		return 0;
}

  求next数组

void get_next(SString* S, int *&next)
{
	next=(int *)malloc(sizeof(int)*S->length);
	int i = 1, j = 0;
	next[1] = 0;
	while (i <= S->length)
	{
		if (j == 0 || S->str[i] == S->str[j])
		{
			i++;
			j++;
			next[i] = j; 
		}
		else
			j = next[j];
	}
}

  求nextval数组

void get_nextval(SString*T,int *&nextval)
{
	nextval=(int *)malloc(sizeof(int)*T->length);
	int i = 1, j = 0;
	nextval[1]=0;
	while(i<=T->length)
	{
		if(j==0||T->str[i]==T->str[j])
		{
			i++;j++;
			if(T->str[i]!=T->str[j])
				nextval[i]=j;
			else
				nextval[i]=nextval[j];	
		}
		else
			j=nextval[j];
	}
}

  

以上是关于KMP算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构—串KMP模式匹配算法

Python ---- KMP(博文推荐+代码)

KMP算法及Python代码

KMP算法及Python代码

图解KMP算法原理及其代码分析

Kmp算法Java代码实现