KMP就是一种快速在A串中查找B串的算法。
算法流程大概如下:
A=ababaabacb
B=aba
定义两个指针:i , j
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j(匹配成功,次数加一)
______________________________
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j(匹配成功,次数加一)
______________________________
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j(匹配成功,次数加一)
______________________________
i
v
ababaabacb
aba
^
j
______________________________
i
v
ababaabacb
aba
^
j
______________________________
以上就是KMP算法的全过程
关键在于求出模式串在与文本串失配后应该让自己的第几位与文本串此时匹配到的位置对齐。(求next数组)
求next数组的过程如下(a——文本串,b——模式串):
for (i=start;i<=end;i++) //start指匹配的起点,end指终点,一般start=1,end=n
next[i]=start-1; //一般这一个循环就写作next[start]=start-1一句话
j=start-1; //开始求next
for (i=start/*重点*/;i<end;i++) { //这里的i是比j大1的,为什么?(“自己与自己匹配”)
while (j>(start-1) && b[j+1]!=b[i+1]) j=next[j];//当匹配不成功,就跳到上一个可能成功的位置
if (b[i+1]==b[j+1]) j++; //b[i+1]与此时的b[j+1]相等的话就有next[i+1]=j+1;
next[i+1]=j;
}
匹配过程如下:
j=start-1;
for (i=start-1/*注意*/;i<end;i++) {
while (j>start-1 && b[j+1]!=a[i+1]) j=next[j];
if (b[j+1]==a[i+1]) j++;
if (j==strlen(b)) {//匹配到第串长位,匹配完成(因为位数是从0开始的)
...
j=next[j]; //继续匹配
}
}
大概就是这样了。