标签:
2b青年的说法;先去匹配,如果失败,可能失败的前一部分长度的字符串的前缀和后缀相同,那就可以直接把前缀移到后缀那一块,省去了很多没用的时间。
关键就是求next数组。根据递归的思想;
next[0]=-1;
next[j]=k;p[0...k-1]=p[j-k...j-1];
1.如果p[j]==p[k],p[0...k]=p[j-k...j];next[j+1]=next[j]+1=k+1;
2.如果p[j]!=p[k],由于之前的都求了next[],所以直接移到,即匹配失败的时候,k=next[k]。
int kmp(char *s,char *p) { int i,j,len=strlen(s); i=0; j=0; getnext(p); while(i<len) { if(j==-1||s[i]==p[j]) { i++; j++; } else { j=next[j]; } if(j==strlen(p)) { return i-strlen(p); } } return -1; }//kmp匹配部分 void getnext(char *p) { int k,j,len=strlen(p); next[0]=-1; j=0; k=-1; while(j<len-1) { if(k==-1||p[j]==p[k]) { j++; k++; next[j]=k; } else k=next[k]; } }//递归思想求next
标签:
原文地址:http://www.cnblogs.com/sweat123/p/4712735.html