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;
}
上一篇:【ybtoj】【kmp】公共子串


下一篇:字符串专题