这个算法感觉很难说出来,主要靠自己领会可以参见《算法导论》P568,和数据结构相关书籍 #include <stdio.h> #include <string.h> int next[8]; void get_next(char *T,int *next) { //求模式串T的next函数值并存入数组next int i = 1; next[1] = next[0] = 0; int j = 0; while (i < (int)strlen(T)) { if(j == 0 || T[i] == T[j]){++i; ++j; next[i] = j;} else j =next[j]; } }//get_next int Index_KMP(char *S, char *T, int pos){ //1<= pos <=StrLength(S) int i = pos, j =1; while (i <= strlen(S) && j <= strlen(T)){ if(j == 0 || S[i] == T[j-1]) {++i; ++j;}//继续比较后继字符 else j = next[j];//模式串向右移动 } if (j > (int)strlen(T)) {printf ("suc!"); return i - strlen(T)+1;} else return 0; }//Index_KMP void main() { int pos; char *S = "bacbababaabcbab"; char *T = "bababaa"; get_next(T,next); pos = Index_KMP(S,T,0); printf("%d",pos); }