• 关于kmp的总结


    1.对于代码中i-next[i]代表了字符串最小前缀且满足能不断的复制得到原字符串;len%(i-next[i])==0时代表字符串刚刚是子串的整数倍;
    若len%(i-next[i])==0匹配时每一次移动的距离i-next[i]是相等的,若不等则只有最后一次不等;
    2.len =strlen(s);next[len]代表匹配度最大的前缀或后缀。
    3.详细分析一下:【就用上面的第一个例子说明吧】(poj2752)
    求出next值:[非修正]
    下标:     0  1  2  3  4  5  6  7  8  9  10 11   12  13  14  15  16  17


    串:              a  b  a  b  c  a  b  a  b   a   b     a     b     c    a     b    a   b


    next值:  -1  0 0  1  2  0  1  2  3  4   3   4     3     4     5    6    7    8    9
    len2 = 18    next[len2] = 9
    说明对于前面长度为18的字符串,【长度为9的前缀】和【长度为9的后缀】是匹配的, 即上图的蓝色跟红色匹配
    也就是整个串的最大前后缀匹配长度就是9了
    所以接下来根本不需要考虑长度大于9的情况啦


    好了!既然现在只需考虑长度小于9的前后缀匹配情况,那么
    [问题就转化成蓝色串的前缀跟红色串的后缀的匹配问题了!!!
    又因为蓝串==红串
    所以问题又转化成
    找蓝串自己的前缀跟自己的后缀的最大匹配了!!!
    那么我们现在就要找next[9]的值了【next[9]的含义:蓝串的最大前后缀匹配】


    回忆第一步:我们找的是next[len2]=9【len2=18】
    怎么使得第二部目标变成9【求next[9]】呢?
    其实next[len2]=9同时可以表示为:最大匹配前后缀的【前缀长度】
    那么next[9]的意义就是:
    【主串】的最大匹配前后缀的【前缀】的【最大匹配前后缀】了!!
    也就是上面蓝串的前后缀最大匹配长度了!!


    那么算法描述就是:
    第一步:求next[len2], 即next[18] = 9;
    第二步:把9代进来,即求next[9] = 4;
    第三步:把4代进来,即求next[4] = 2;
    第四步:next[2] = 0; 也就是下标2之前的串已经没有前后缀可以匹配了
    所以答案就是: 2 4 9 18 【PS: 从小到大输出,18是串长,显然符合题意】
    4.String:ababab


      Next: -1001234
    我们用(len)-next[len]就是字符串向右移动的位数.也可以说是最小前缀,则重复的次数len/(len-next[len]);
    i-next[i]同理;

  • 相关阅读:
    Climbing Stairs
    交换排序
    解析Ceph: Snapshot
    OpenStack Hacker养成指南
    从UnitedStack OS 1.0 Preview试用申请问卷调查学习OpenStack
    Tun/Tap interface tutorial
    Linux下的TUN/TAP编程
    基于KVM的虚拟化研究及应用
    Linux 上的基础网络设备详解
    linux下TUN/TAP虚拟网卡的使用
  • 原文地址:https://www.cnblogs.com/lxm940130740/p/3235806.html
Copyright © 2020-2023  润新知