优化KMP算法
对KMP算法已经有了认识, 下面让我们使用KMP算法,来了解KMP的匹配流程。
例子:源文本串S为 "abacababc",模式串P为 "abab"。
next数组表如下:
若当前程序已经匹配到如下所示的地方。根据next数组,能够判断下一次将进行s[3]与p[1]的比较,这一结果必然失败。为什么会存在这样的问题呢???
abacababc
abab
以上问题出现的原因是,p[j]==p[next[j]] 且 p[j]!=s[i],所以,必定有 p[next[j]]!=s[i]。因此,问了解决上面的问题,我们应该对next数组进行优化,以避免 p[j] == p[next[j]]的情况出现。
优化next数组
原则:
在原next数组的计算规则之上,增加新的规则。即当 p[j] == p[next[j]]时,则把next[j]的值再次递归。代码如下:
void GetGoodNext(char []p, int []next){
int pLen = p.length;
next[0] = -1;
int k = -1;
int j = 0;
while(j < pLen-1){
if(k==-1 || p[k]==p[j]){
++j;
++k;
//以下4行为修改部分
if(p[j] != p[k])
next[j] = k;//原next数组的过程
else
next[j] = next[k];
}else{
k = next[k];
}
}
}