KMP算法的Next数组

在看这篇文章之前最好对kmp算法有一定了解。相关的资料网上也有很多的。这篇主要是给还在困惑next数组的小伙伴分享一下我是如何理解的。并不一定对所有人都有用。

Next数组的意义:

用法上的意义,当字符串下一步用next [j] 处的字符继续跟文本串i 处的字符匹配,相当于模式串向右移动 j - next[j] 位。如模式串中在j 处的字符跟文本串在i 处的字符失配时,下一步应该跳到哪个位置。

每个元素的意义,数组当前位置前的,前缀和后缀(最后)的字符相同的个数。

如果各位可以直接理解next数组的原理。可以不用看下面的话。

我理解next数组的方法:

1.看一遍原理的证明(没明白,也没记住)。

2.再看一遍(还是没理解,充分证明了我的愚钝)。

3.看一遍代码(和证明一点也联系不上)。

4.重点:按照代码画一遍。之后再思考一遍KMP算法的意义。

5.重复第1步。

代码:
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];  
        }  
    }  
}  

练习1:ABCDABDFAB

不知道为什么道出的图片少一部分,缺少的部分是数组p的下标J

后面我就不画了,有兴趣的小伙伴可以补充上。

如果反复验证后有些心的,那么考虑下 "aaaa" 的next数组是什么呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值