讲解详见matrix67大神博客,直接上代码了。
#include <stdio.h> #include <string.h> int next[100]; int pre_processing(char* s) { next[0]=0; int i,j; for(i=1;i<strlen(s);i++) { j=next[i-1]; while(j!=0&&s[j]!=s[i]) j=next[j-1]; if(s[j]==s[i]) next[i]=j+1; else next[i]=0; } return 0; } int kmp(char *a,char *b) { int i,j=0; for(i=0;i<strlen(a);i++) { while(j>0&&a[i]!=b[j]) j=next[j-1]; if(a[i]==b[j]) { j++; } if(j==strlen(b)) return i-j+1; } return -1; } int main() { char a[100],b[100]; scanf("%s",a); scanf("%s",b); pre_processing(b); printf("%d",kmp(a,b)); return 0; }