KMP next数组的理解问题

发布于 2022-09-12 02:31:28 字数 761 浏览 26 评论 0

void GetNext(char* p int *next)
{
    int pLen = strlen(p); //求出长度;
    next[0] = -1;
    int k = -1;
    int j = 0;
    while (j < pLen - 1)
    {
        //p[k]表示前缀,p[j]表示后缀
        if (k == -1 || p[j] == p[k])   //匹配时,
        {
            ++k;
            ++j;
            next[j] = k;
        }
        else  //不匹配时;
        {
            k = next[k];//不满足就后退;
        }
    }
}

今天在基本了解KMP算法后大致明白了它的原理,以及next[]数组的求法,
满足一下规律它如果有相同最长的前后缀则位前缀的下一位,如果没有前后缀则为当前位 ,我对代码next[j]=k的理解 ,就是满足在p[i]=p[k] 的情况下的 将其当作最长前串存它的下一位 ,而k=next[k] ,就是当没有相同的最长前后缀时 返回到上一个有相同前后缀的位置,在对其进行比较加长。
这段代码是如何求出在不匹配时的当前位呢?
比如
A B A B
0 1 1 2
它的 匹配到B时返回到 1 上述的求next[]数组是如何做到的呢?
感觉上述的代码在没有相同的前后缀的情况下都会退回到 ,k=-1 , next[j]=0 ;希望大佬能指点一下.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青衫负雪 2022-09-19 02:31:28

按你的代码,你提供的

A B A B  
0 1 1 2

是错的,应该是,

 A B A B  
-1 0 0 1

next 数组是用来失配时进行跳转的,既然你都理解了 next 数组是如何求解的,那我觉得也应该能理解这点啊。KMP 算法难点是如何求解 next 数组,而不是如何理解 next 数组的作用,你倒是反过来了。

我直接丢一篇文章:https://ethsonliu.com/2018/04...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文