kmp算法实现(c语言)

kmp算法实现(c语言)

这个kmp算法思路,以及其中的next[]数组的解释可以说是我看过最详细的了,附上链接

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void getnext(char *p,int *next)
{
	int len=strlen(p);
	int k=-1;
	int j=0;
	next[0]=-1;
	printf("\n j= %d next[0]%d",j,next[j]);
	while(j<len-1)
	{
		if(k==-1||p[k]==p[j])
		{
			k++;
			j++;
			next[j]=k;
			printf("\n j= %d next[%d]%d",j,j,next[j]);
					}
		else{
			k=next[k];
		}
		
	}
	
}
int kmp(char *s,char *p,int *next)
{
	int i = 0;
	int j = 0;
	int sLen = strlen(s);
	int pLen = strlen(p);
	while(i<sLen&&j<pLen) 
	{
		if (j == -1 || s[i] == p[j])
		{
			i++;
			j++;
		}
		else
		{
			//②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]    
			//next[j]即为j所对应的next值      
			j=next[j];
	}
		

	}
	if(j>=pLen)
		return(i-j);
	return 0;

} 
int main(){
	int next[50],n;
	char s[100] = "babababababababacabaabbababaabaababacabababababbcababbabababcababba";
    char p[50] = "ababacab";
    printf("\n实现如下:");
    printf("\n s[] =%s:",s);
    printf("\n p[] =%s:",p);
    getnext(p,next);
    n=kmp(s,p,next);
    printf("\n匹配的位置为 %d",n);
    return 0;
	 
} 

猜你喜欢

转载自blog.csdn.net/weixin_43904021/article/details/87792889