1 void get_next(char *str) 2 { 3 int len=strlen(str); 4 next[0]=-1; 5 int j=0,k=-1;//k记录next[]; 6 7 while(j<len) 8 { 9 if(k==-1||str[j]==str[k]) 10 { 11 k++; 12 j++; 13 if(str[k]!=str[j]) 14 next[j]=k; 15 else next[j]=next[k]; 16 17 } 18 else k=next[k]; 19 } 20 } 21 int kmp(char *pattern,char *s) 22 { 23 24 get_next(pattern); 25 26 27 int len=strlen(pattern);//模版串 28 int slen=strlen(s); 29 int k=-1, j=0; 30 31 while(k<len&&j<slen) 32 { 33 if(k==-1||pattern[k]==s[j]) 34 { 35 j++; 36 k++; 37 } 38 else k=next[k]; 39 } 40 if(k<slen)return 0; 41 else return 1; 42 43 44 45 }