KMP算法

概述

这种改进算法是D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的,因此人们称它为克努特-莫里斯-普拉特算法(简称为KMP算法)。该算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。其改进在于:每当一趟匹配过程中出现字符比较不等时,不需回溯i指针,而是利用已经得到的‘部分匹配’的结果将模式向右‘滑动’尽可能远的一段距离后,继续进行比较。

移动的距离是最长字串长度。前缀等于后缀的最长字串,形式化的描述如下:

p1,p2,...,p(k-1) = p(j-k+1),p(j-k+2),...,p(j-1)
满足上式的最大k;

算法

k=next[j]; 在next[j]已知的情况下求next[j+1]:

 1.如果相等则最长字串+1
 if p(k)==p(j)
 next[j+1]=k+1;

       3.优化:如果p(j+1)==p(k+1),如果j+1不匹配那么k+1也不匹配
       if p(j+1)==p(k+1)
       next[j+1]=next[k+1];

 2.把这个看成模式匹配,则k时失败,移动next[k]
 if p(k)!=p(j)
 k=next[k];
      循环直到:
      k''==0
      next[j+1]=1;

C实现

void get_next(string t,int next[])
{
    i=1;
    next[1]=0;
    j=0;
    while(i<t.length)
    {
          if(j==0 || t[i]==t[j])
          {
                ++i;
                 ++j;
                 if(t[i]!=t[j])next[i]=j;
                 else next[i]=next[j];
         }
         else
                  j=next[j];
    }
}

你可能感兴趣的:(KMP)