从头到尾彻底理解KMP

来源:互联网 发布:国外聊天软件 编辑:程序博客网 时间:2024/06/06 16:57

优化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];        }    }}

原创粉丝点击