{
int i,j; i=0;
next[0]=-1;
for(j=1; j i=next[j-1]; while(T[j]!=T[i+1]&&i>=0) i=next[i]; if(T[j]==T[i+1]) next[j]=i+1; else next[j]=-1; } for(j=0; j<=m; j++) { printf(\ if((j+1)%5==0) printf(\ } cout< void GetNextVal(char T[MAXSTRLEN],int (&next)[64]) { int i,j; i=1; next[1]=j=0; while(i<(int)T[0]) if(j==0||T[i]==T[j]) { ++i; ++j; if(T[i]!=T[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; for(i=1; i<(int)T[0]; i++) { printf(\ if(i%5==0) cout< cout< int IndexKMP(char S[MAXSTRLEN],char T[MAXSTRLEN],int (&next)[64]) { int i,j,n,m; i=j=1; n=(int)S[0]; m=(int)T[0]; while((i ++i; ++j; } else j=next[j]; if(j>=m) return i+1-m; else return 0; } int IndexKMP(char S[MAXSTRLEN],char T[MAXSTRLEN],int (&next)[64],int pos) { int i,j; i=pos; j=1; while((i<(int)S[0]||j<(int)T[0])&&T[j]!='\\0'&&S[i]!='\\0') if(j==0||S[i]==T[j]) { ++i; ++j; } else j=next[j]; if(j>=(int)T[0]) return i+1-(int)T[0]; else return 0; } int IndexKMP(char S[MAXSTRLEN],char T[MAXSTRLEN],int (&next)[64],int n,int m) { int i,j; i=j=0; while(i ++i; ++j; } else if(j==0) i++; else j=next[j-1]+1; if(j //BF算法,普通的模式匹配算法 int IndexBF(char S[MAXSTRLEN],char T[MAXSTRLEN],int pos) { int i,j; i=pos; j=1; while(i<=S[0]&&j<=T[0]) if(S[i]==T[j]) { ++i; ++j; } else { i=i-j+2; j=1; } if(j>T[0]) return i-T[0]; else return 0; } int main() { int Index,N,M,next[64]= {0}; char s[MAXSTRLEN],t[MAXSTRLEN]; printf(\输入主串s:\ gets(s); printf(\输入模式串t:\ gets(t); N=strlen(s); M=strlen(t); printf(\主串s长=%d\\n\ printf(\模式串t长=%d\\n\ GetNext(t,next,M); Index=IndexKMP(s,t,next,N,M); printf(\匹配结果-------------\\n\ if(Index!=-1) printf(\模式串t在主串s的位置从第%d个字符开始\\n\ else printf(\主串s中不含模式串t\\n\ printf(\ printf(\的结果:\\n\ s[0]=N; t[0]=M; GetNext(t,next); Index=IndexKMP(s,t,next,1); if(Index) printf(\模式串t在主串s的位置从第%d个字符开始\\n\ else printf(\主串s中不含模式串t\\n\ printf(\ printf(\的结果:\\n\ GetNextVal(t,next); Index=IndexKMP(s,t,next,1); if(Index) printf(\模式串t在主串s的位置从第%d个字符开始\\n\ else printf(\主串s中不含模式串t\\n\ printf(\ printf(\的结果:\\n\ GetNext(t,next); Index=IndexKMP(s,t,next); if(Index) printf(\模式串t在主串s中的位置从第%d个字符开始\\n\ else printf(\主串s中不含模式串t\\n\ printf(\ printf(\的结果:\\n\ Index=IndexBF(s,t,1); if(Index) printf(\模式串t在主串s中的位置从第%d个字符开始\\n\ else printf(\主串s中不含模式串t\\n\ cin.get();//用来接收一行字符串 } 五.运行结果截图 匹配成功