zoukankan      html  css  js  c++  java
  • KMP笔记√//找最大子串,前缀自匹配长度

    假设s1里找s2,
    然后s2进去匹配
    假设在第三位失配
    那么说明前两位是匹配成功的
    如果这时候将s2后移一位相当于将s2的第一位和s2的第二位比较,如果我们已知s1(1)≠s1(2)那么就可以直接后移两位
    而这时候就是s1(1)和s1(3)比较,如果s1.1=s1.3那就可以直接后移3位了
    我们的目标就变成了在s1里找到一个递推式满足f(i)
    i表示在第i位失配后移的位数
    现在要找递推方法,假设f(i)已知现在由f(i)推出f(i+1)
    假设f(i)=k,现在假设失配位是k,我们要做的就是找到一个最大的m满足 s1[0],s1[1]....s1[m-1]  ==  s1[k-m],s1[k-m+1]...s1[k-1]
    回到刚刚的我们假设f [i] = k,那么f [i+1]有3种情况:
    ①s1[k+1] == s1[i+1] —>f[i+1]=k+1
    ②如果s1[k+1] != s1[i+1] —>问题就变成了在前k个里找一个最大的s使得s1[0],s1[1]...s1[s] == s1[k+1-s], s1[k-s] ...s1[k+1]
    这个s是已知的,就是f[k+1]
    f[k+1] <=0 —>f[j+1] = 0
     
    That is over.
     
     
     
     
     
     

    看到一个推荐的blog讲的超详细我这么蒻都看懂了七七八八
    http://www.matrix67.com/blog/archives/115
    mark一下√
     
     

     
    //我们要在a串中找b串出现的次数 b串叫做模式串,a串叫做匹配串
    考虑暴力匹配的时候在匹配串枚举模式串的开头在哪里,一位一位比较是不是相同,不相同的话就把开头往下移以为继续判断
    假设模式串匹配了1~j位,在j+1位和匹配串发生了冲突,这时候要在匹配串重新设置开头从哪一位开始匹配。
    /*
      比如原先是i开头,就比较i~i+j-1位,然后这i~i+j-1位都是相同的,但是在i+j位它会变成不同的
      这时候如果暴力移动指针的话,如果发现从i+1到i+j-1中有一段和i开始到i+j-1位中间有一段是相同的话,那就可以把中间那段替换过去
    */
    //其实就是不匹配的那个的前面X位还是后面X位有匹配串的开头资磁的XX位就移到X位去
    //这样时间复杂度就低啦
     
     
     
     
     
     
     
     

     
     
    //hzwer说这玩意儿NOIP不考,省选考,标记一下
     

     
     突然发现的blog感觉排版什么的很资磁
    https://blog.sengxian.com/algorithms/kmp#main
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    第一只猫环境准备
    高阶Promise--async
    操作系统源码编译心得
    闭包的应用场景
    全栈微信小程序商城 学习笔记10.1 对更新收货地址接口做权限控制
    全栈微信小程序商城 学习笔记9.1 新建登录接口
    全栈微信小程序商城 学习笔记8.5 product分类商品接口编写
    全栈微信小程序商城 学习笔记8.4 category分类接口编写
    全栈微信小程序商城 学习笔记8.3 product最近新品接口编写
    全栈微信小程序商城 学习笔记8.2 theme详情接口编写
  • 原文地址:https://www.cnblogs.com/gc812/p/5799287.html
Copyright © 2011-2022 走看看