• next数组求最小循环节


    1、kmp产生的next数组:

    最小循环节(长度)=len-next[len];

    证明:

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

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

     k    m      x      j       i

    由上,next【i】=j,两段红色的字符串相等(两个字符串完全相等),s[k....j]==s[m....i]

    设s[x...j]=s[j....i](xj=ji)

    则可得,以下简写字符串表达方式

    kj=kx+xj;

    mi=mj+ji;

    因为xj=ji,所以kx=mj,如下图所示

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

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

     k   m        x     j   

    看到了没,此时又重复上面的模型了,kx=mj,所以可以一直这样递推下去

    所以可以推出一个重要的性质len-next[i]为此字符串的最小循环节(i为字符串的结尾),另外如果len%(len-next[i])==0,此字符串的最小周期就为len/(len-next[i]);

    ps:以上证明来自网上,表示没怎么看懂,下面是自己的简单理解:

    2、扩展kmp产生的next数组:

    待研究。

            int repetend;//最小循环节
            for(j=1;j<=len1;++j){
                if(j+_next[j]>=len1){
                    repetend=len1%j?len1:j;
                    break;
                }
            }
  • 相关阅读:
    TCP协议详解-IPv4
    welcome to my cnblog
    怎样解决闭包造成的内存泄漏
    跳转路由后请求失败
    vant grid组件图片加载问题
    3次握手
    res.send()传参----Invalid status code: 1
    堆栈总结
    jQuery实现全选
    phpstudy_pro打开MySQL服务,一闪一闪的
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4939138.html
Copyright © 2020-2023  润新知