假设主串为‘s1s2.....sn’,模式串为‘p0p1....pm’,当si不等于pj时,即匹配过程产生了“失配”,模式串“向右滑动”可行的距离最远是多少,这是要解决的问题。
假设此时应与模式中第k(k<j)个字符继续比较,则模式中应满足
'P0P1...............Pk-1' = 'Si-k Si-k+1...............Si-1’ (1)
且不存在k‘>k 满足上述表达式。而已经得到的部分匹配的结果式
'Pj-k+1Pj-k+2.......Pj-1' = 'Si-k Si-k+1...............Si-1’ (2)
由(1)式和(2)式可得
'P0P1...............Pk-1' = 'Pj-kPj-k+1.......Pj-1'
若令next[j]=k, 则
主要是next[j]值的计算
next[0]=-1;
设next[j]=k,则
'p0.....pk-1'='pj-k........pj-1'
(1) 当 Pk=Pj时
'p0.....pk-1pk'='pj-k........pj-1pj'
next[j+1]=next[j]+1;
(2) pk!=pj
next[j]=k; next[k]=k'
p0......pk-1=pj-k.....pj-1 (3)
po.......pk'-1=pk-k'......pk-1 (4)
由(3)和(4)得po.......pk'-1=pk-k'.......pk-1=pj-k'.......pj-1=
若 Pj=Pk' next[j]=next[k']+1;
否则再继续上面的操作
... {
int i=0,j=-1,next[0]=-1,len=strlen(T);
while(i<len)
...{
if(j==-1||T[i]==T[j])
...{
i++;j++;
next[i]=j;
}
else j=next[j];
}
}
int Kmp_index( char * S, char * T, int pos)
... {
int i=pos,len1=strlen(S),len2=strlen(T),j=0;
while(i<len1 && j<len2)
...{
if(j==-1 || S[i] == T[j])
...{
i++; j++;
}
else j = next[j];
if(j>len2)
return i-j;
else return 0;
}
}