KMP

原文出处

Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法。

1.next数组怎么求???

 

给定字符串“ABCDABD”,可求得它的next 数组如下:

把next 数组跟之前求得的最大长度表对比后,不难发现,next 数组相当于“最大长度值” 整体向右移动一位,然后初始值赋为-1。意识到了这一点,你会惊呼原来next 数组的求解竟然如此简单:就是找最大对称长度的前缀后缀,然后整体右移一位,初值赋为-1(当然,你也可以直接计算某个字符对应的next值,就是看这个字符之前的字符串中有多大长度的相同前缀后缀)。

换言之,对于给定的模式串:ABCDABD,它的最大长度表及next 数组分别如下:

 代码:

void getnext()
{
    next[0] = -1;
    int k = -1;
    int i = 0;
    while (i < len-1)
    {
        if(k == -1 || s[i] == s[k])
        {
            ++k;
            ++i;
            next[i] = k;
        }
        else
        {
            k = next[k];
        }
    }
}

 

2.kmp怎么写???

 

int kmp()
{
    int i = 0;
    int j = 0;
    while (i < slen && j < len)
    {
        if (j == -1 || s[i] == p[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
    }
    if(j == len) return i - j;
    else return -1;
}

 习题

posted on 2019-09-03 14:26  By_布衣  阅读(167)  评论(0编辑  收藏  举报

导航