• kmp算法总结


    转载请输入转载地址:http://www.cnblogs.com/handsomecui/

      kmp算法一般分两部getp和kmp;getp是为了得到p数组,这个数组很神奇,p[i]=j;代表第i-1位最近一次失配的位置;

    i         1  2  3  4  5  6  7  8

    s[i]     a  b  a  b  a  b  a  b 

    p[i]    0  0 1  2  3  4  5  6

    p[i]均代表的是最近一次失配的位置;

    有了失配位置,那么我们很容易得到循环节;当前循环节长度就是i-p[i];很容易求得当i%(i-p[i])==0(当然p[i]!=-1)的时候代表字符串开始循环,循环到i-1;

    当循环,我们可以求出循环次数i/(i-p[i]);

    重刷了kmp的题;

    总结下:

    http://www.cnblogs.com/handsomecui/p/4710836.html

    找串的重复度,相当于求循环次数;

    http://www.cnblogs.com/handsomecui/p/4711822.html

    相对于上题,这题不是从自身找,而是串2在串1中出现的次数;(完全出现)

    当找到串2结束时,我们只需要回到串2 起点重新匹配就好了;

    http://www.cnblogs.com/handsomecui/p/4710935.html

    http://www.cnblogs.com/handsomecui/p/5233496.html

    相对于上题,这两个题也是串2在串1中出现的次数;但是这个相当于看小说找文字一样,假设abab abababab 这个题答案是3,上个题就是2,上个是剪布条,只有是abab  abab 这个是匹配文字,所以是三个,位置:1 4,2 6,4 8;

    http://www.cnblogs.com/handsomecui/p/4711034.html

    让在一个串中找字串,使这个字串即是串s的前缀又是后缀;我们需要知道

    next[i]的意义:前面长度为i的字串的【前缀和后缀的最大匹配长度】 ;

    我们从len开始往前找就好了;这个题非常考验对p数组的理解;

    http://www.cnblogs.com/handsomecui/p/4711437.html

    让求串2在串1中首次出现的位置;这里既可以用kmp,也可以用函数strstr,非常实用;

    http://www.cnblogs.com/handsomecui/p/4711719.html

    给定一个字符串,问这个字符串的所有前缀中,有哪些前缀可以由某个串重复k次组成;

    用到了我们前面总结的结论:

    当i%(i-p[i])==0(当然p[i]!=-1)的时候代表字符串开始循环,循环到i-1;可以求出循环次数i/(i-p[i]);

    http://www.cnblogs.com/handsomecui/p/4711962.html

    第二个串能否在第一个串循环位移后的串中找到;我们只需要把串翻转下就好了;

    http://www.cnblogs.com/handsomecui/p/4764736.html

    s的子串中不包含s1,s2...sn的最长串;

    这个题就比较综合了,用到贪心的策略,用kmp找位置,贪心求长度就好了;

     http://www.cnblogs.com/handsomecui/p/4907830.html

    添加串使其回文;反转串进行kmp匹配即可;

  • 相关阅读:
    浅析TCP /UDP/ IP协议
    大小端模式
    小技巧—计算内存
    浅谈启发式合并
    浅谈换根DP
    POJ 3585 Accumulation Degree
    OSGi类加载问题
    Redis缓存集群方案
    Tair分布式缓存
    Tedis:淘宝的Redis的Java客户端开发包
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5304020.html
Copyright © 2020-2023  润新知