找了很多视频,在站找到了一个还不错的视频。
b站KMP视频
还有全套分类
https://www.bilibili.com/read/cv8013121
就是代码少。不过自己写也差不多啦。
#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; }