KMP算法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+1,j],很显然,next[j+1]=next[j]+1=k+1;


   2)若P[j]!=P[k],则可以把其看做模式匹配的问题,即匹配失败的时候,k值如何移动,显然k=next[k]。


void
getNext(char *p,int *next) { next[0]=-1; next[1]=0; for (int i=2;i<strlen(p);i++) { int j=i-1; int k=next[j]; while (true) { if (p[i-1]==p[k]) { next[i]=next[j]+1; break; } else { if (k==0) { next[i]=0; break; } else { j=k; k=next[j]; } } } } }
原文地址:https://www.cnblogs.com/GoAhead/p/2657747.html