复习下KMP&e-KMP

KMP算法的核心思想是next数组。

接下来,我来谈谈我对KMP数组的理解。

KMP算法是用来匹配有多少相同字串的一种算法。

1、next数组记录前缀与后缀相等的位置,然后跳到这。

2、数组即记录后缀与前缀相等的个数

如ABCABC

那么next数组就是

0 1 2 3 4 5 6
-1 0 0 0 1 2 3

 

KMP算法核心

 

int next_[1000010];

void kmp(char x[],int m,int next_[])
{
    int i ,j;
    j = next_[0] = -1;
    i = 0; 
    while( i < m){
        while(-1!=j&&x[i]!=x[j]) j = next_[j];
        next_[++i] = ++j;
    }
}

 

返回x 在 y 中出现的次数,可以重叠

 

int kmp_count(char x[],int m,char y[],int n)
{
    int i,j;
    int ans = 0;
    kmp(x,m,next_);
    i = j = 0;
    while(i < n)
    {
        while(-1!=j && y[i]!=x[j]) j = next_[j];
        i++;j++;
        if(j >= m)
        {
            ans++;
            j = next_[j];
        }
    }
    return ans;
}

 

还可以预处理,这里就暂时不谈了

 

e-KMP类似

0 1 2 3 4 5 6
6 0 0 3 0 0 0
posted @ 2019-03-06 21:01  DWVictor  阅读(346)  评论(1编辑  收藏  举报