首先一个next[]数组用来进行如果匹配失败,进行移动的地方

1 void next_get(string pos,int size,int next[]) 2 { 3 int k=-1; 4 next[0]=-1; 5 for(int i=1;i<size;i++) 6 { 7 while(k>-1&&pos[k+1]!=pos[i]) 8 k=next[k]; 9 if(pos[k+1]==pos[i]) 10 k++; 11 next[i]=k; 12 13 } 14 15 } 16 int KMP(sting s,int next[],string pos) 17 { 18 19 int a=s.size();//主串的长度 20 int b=pos.size();//要匹配字符串的长度 21 int k=-1; 22 for(int i=0;i<a;i++) 23 { 24 while(k>-1&&s[i]!=pos[k+1]) 25 k=next[k]; 26 if(s[i]==pos[k+1]) 27 k++; 28 if(k==b-1) 29 { //k=-1; 30 //i=i-b+1;//注释的是要进行再次查询的 31 return i-k; 32 } 33 } 34 35 }

1 void GetNext(char* p,int next[]) 2 { 3 int pLen = strlen(p); 4 next[0] = -1; 5 int k = -1; 6 int j = 0; 7 while (j < pLen - 1) 8 { 9 //p[k]表示前缀,p[j]表示后缀 10 if (k == -1 || p[j] == p[k]) 11 { 12 ++k; 13 ++j; 14 next[j] = k; 15 } 16 else 17 { 18 k = next[k]; 19 } 20 } 21 }