KMP模式(字符串)匹配算法讲解
设有主串S={s0,s1,s2……s(M-1)},S.length=M,0≤i≤M-1
模式串T={t0,t1,t2……t(N-1)},T.length=N,0≤j≤N-1
(M>>N>0)
对模式串进行预处理,生成“部分匹配”信息数组next[N]
对于任意一个T[j](tj),其next[tj]=Max{k|第k个元素前的字符串{t0,t1……t(k-1)}==第j个元素前的k个字符串{t(j-k),t(j-k+1)……t(j-1)}},且next[t0]=-1
将模式串T和主串S进行比较
i从0开始,j从0开始,若S[i]==T[j],则i++,j++,若S[i]!=T[j],则将j=next[tj],再比较S[i]与T[j],循环上述操作,直至匹配成功(j>N-1)或匹配失败(i>M-1)
例:S={aaaaab}
M=6
T={aaab}
N=4
Next表
下标 | 0 | 1 | 2 | 3 |
值 | a | a | a | b |
Next值 | -1 | 0 | 1 | 2 |
修正next表,若next表中存在k=next[j],T[k]==T[j]时,则使next[j]=next[k],k<j,记为nextval表
Nextval表
下标 | 0 | 1 | 2 | 3 |
值 | a | a | a | b |
Nextval值 | -1 | -1 | -1 | 2 |
则匹配流程为(next表):
(1) i=0,j=0,S[i]==T[j],i++,j++
(2) i=3,j=3时S[3]!=T[3]
(3) 则j=next[t3]=next[T[3]]=2
(4) i=3,j=2,S[3]==T[2],i++,j++
(5) i=4,j=3时S[4]!=T[3]
(6) 则j=next[t3]=next[T[3]]=2
(7) i=4,j=2, S[4]==T[2],i++,j++
(8) i=5,j=3, S[5]==T[3],i++,j++
(9) i=6,j=4>(N-1)=3,则停止,输出i-N=2,{s2,s3……s(2+N)}为匹配的模式串