Java教程

KMP算法

本文主要是介绍KMP算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

找了很多视频,在站找到了一个还不错的视频。

b站KMP视频

还有全套分类

https://www.bilibili.com/read/cv8013121

就是代码少。不过自己写也差不多啦。

  • 第一节KMP我的课后作业
#include<stdio.h>

int next[]={-1,0,0,0,0,1,2,3};

int KMP(char* s,char *t)
{
	int i=0,j=0;
	while(s[i]&&t[j])
	{
		if(s[i]==t[j])
		{
			i++;
			j++;
		}else{
			j=next[j];
			if(j==-1)
			{
				i++;
				j++;
			}
		}
	}
	if(!t[j])
	{
		return i-j;
	}else{
		return -1;
	}
}

int main()
{
	char *s="DABCDABD";
	char t[100];
	gets(t);
	int p=KMP(s,t);
	if(p!=-1)
	{
		printf("%d\n",p);
	}else{
		printf("查询不到字串\n");
	}
	return 0;
}
  • 第二节课后作业
#include<stdio.h>
#include<string.h>

int next[8]={-1,0};

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

int KMP(char s[],char t[])
{
	int i=0,j=0;
	while(s[i]&&t[j])
	{
		if(s[i]==t[j])
		{
			i++;
			j++;
		}else{
			j=next[j];
			if(j==-1)
			{
				i++;
				j++;
			}
		}
	}
	if(!t[j])
	{
		return i-j;
	}else{
		return -1;
	}
}

int main()
{
	char s[]="DABCDABD";
	char t[100];
	gets(t);
	getNext(next,t);
	int p=KMP(s,t);

	for(int i=0;i<strlen(t);i++) printf("%d ",next[i]);
	printf("\n");
	if(p!=-1)
	{
		printf("%d\n",p);
	}else{
		printf("查询不到字串\n");
	}
	return 0;
}
这篇关于KMP算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!