void SetNext(const char *T, int kmpNext[]) { int len=strlen(T);//模式字符串长度。 kmpNext[0]=0; for(int i=1; i<len; i++) { int k=kmpNext[i-1]; while( T[i] != T[k] && k!=0 ) //查找是否有匹配项 k=kmpNext[k-1]; if( T[i] == T[k])//如果有,则next数组位置加1 kmpNext[i]=k+1; else kmpNext[i]=0;//如果不匹配 } } int kmp2(int start,char *S,char *T) { int kmpNext[256]; SetNext(T,kmpNext); int slen=strlen(S); int tlen=strlen(T); int i,j; j = 0; for (i=start;i<slen;i++) { while (j>0 && T[j]!=S[i])//比较字符是否相等 j = kmpNext[j-1]; if(T[j]==S[i] && ++j == tlen)//字符相等,next进位,且如果已经匹配字符,则找到 { int ans = i-tlen+1; printf("%d\n",ans); return ans; } } return -1; }