KMP未优化模板、
要理解KMP最重要的一点就是防止重复的回溯、
!!!很重要!!!很重要!!!很重要
要了解KMP可以去:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html
首先要生成模板串的next数组
1 void getNext(char *p,int *next) 2 { 3 int j,k; 4 next[0]=-1; 5 j=0; 6 k=-1; 7 while(j<strlen(p)-1) 8 { 9 if(k==-1||p[j]==p[k]) //匹配的情况下,p[j]==p[k] 10 { 11 j++; 12 k++; 13 next[j]=k; 14 } 15 else //p[j]!=p[k] 16 k=next[k]; 17 } 18 }
然后来匹配、
1 int KMPMatch(char *s,char *p) 2 { 3 int next[100]; 4 int i,j; 5 i=0; 6 j=0; 7 getNext(p,next); 8 while(i<strlen(s)) 9 { 10 if(j==-1||s[i]==p[j]) 11 { 12 i++; 13 j++; 14 } 15 else 16 { 17 j=next[j]; //消除了指针i的回溯 18 } 19 if(j==strlen(p)) 20 return i-strlen(p); 21 } 22 return -1; 23 }