代码:
int T[N],S[N];//模式串、主串 int nextt[N]; int len1,len2; //定义全局变量, void set_next(int *T,int *nextt) //next数组; { int i,k=0; nextt[0]=0; for(i=1; i<len2; i++) { // int k=nextt[i-1]; while(k!=0&&T[i]!=T[k]) k=nextt[k-1]; if(T[i]==T[k]) k++; nextt[i]=k; } } int kmp(int *S,int *T,int *nextt) //封装kmp; { int n,m; int i,j=0; n = len1; m = len2; set_next(); for (i = 0; i < n; ++i) { while(j > 0 && S[i] != T[j]) j = nextt[j-1]; if (S[i] == T[j]) { j++; } if (j == m) { printf("%d\n",i-j+2); //输出第一个匹配位置; return true; } } return false; } 循环节长度:length=len-nextt[len-];