KMP算法——求next数组
问题的提出
在朴素模式匹配算法下,主串指针往往需要回溯到第一个位置重新进行比较,现在为了减少回溯的现象,要想办法把重复比较的步骤给跳过。
朴素模式匹配算法的改进
每当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的部分匹配结果将模式串向右滑动尽可能远的距离,再进行比较,这个时候就引出了next数组,因为模式串往往比主串短得多,所以求next数组的代价也不会很大。
next数组求法
例子:模式串为ABABABB
步骤:(1)先写好模式串下标
(2)再把模式串抄上去
(3)再根据最长重合的子串的长度再加上1就是要求的next数组了
下标: 1 2 3 4 5 6 7
子串: A B A B A B B
next数组:0 1 1 2 3 4 5
下标6的next数组:因为B前面的串为ABABA,可以得到最长子串是ABA,因为如果不是求最长的子串,而是求最短的子串,在移动模式串和主串进行比较是会跳过一些情况,在这里如果得到的子串是A,模式串直接跳到下标5的位置进行比较,就会忽略了下标3开始比较的这种情况。
next数组的代码:
void getNext(Str substr,int next[]){
int j=1,t=0;
next[1]=0;
while(j<substr.length){
if(t==0||substr.ch[j]==substr.ch[t]){
next[j+1]=t+1;
++t;
++j;
}
else
t=next[t];
}
}
t=next[t]是重复利用之前的结果
具体解释可以看一下这位兄弟的文章:https://www.cnblogs.com/dusf/p/kmp.html