KMP的Next函数求解小记



       next函数是指当前待匹配的字符失配的时候,当前字符之前的字符串的最大相同前后缀的长度。(匹配当前字符,求得next函数对应的是下一个字符的next值。何解?使用next函数都是在比对当前字符失败的情况下,调用当前字符之前字符串的最大相同前后缀)

       如何分析求模式串的next函数?

      求模式串中第j+1个字符的next函数

      1.匹配第j个字符的时候,第j个字符之前已经有最大公共字符串的个数为k;(记为next[j] = k)

      2.若第j个字符和第k+1个字符相等,则第j+1个字符之前的最大公共子串为k+1;(记为next[j+1] = k+1)

      3.若第j个字符和第k+1个字符不等,则需要将第j个字符之前的最大公共前缀获得为t(记为t = next[j] = k),第t+1个字符和第j个字符匹配,则进入2步骤,直到相等或者到首个字符(记为k = next[0] = -1)还不等为止;

      ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     

     算法复杂度:O(m+n)

      ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      next函数求解优化

      当前字符串字符s[i]不等于模式串p[j],模式串j=next[j],此时的p[j]如果与回溯之前的p[j]相等,则显然与模式串的值不等,模式串需要再次回溯j=next[j]。那么问题来了,为什么如果回溯后对应的字符一直相等,为什么不一直回溯呢?因为一直匹配过程中,只要第一次匹配成功,则不会进入第二次的匹配。所以上述的问题根本不会存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值