首页 > 其他分享 >KMP的相关定义与性质

KMP的相关定义与性质

时间:2023-02-25 21:24:32浏览次数:30  
标签:pre 子串 定义 mb next KMP border 性质

声明:本文整理了北大附中肖然老师关于KMP讲解的核心要点。

符号

  • 子串:从原串中选取连续的一段,即为子串;空串也是子串
  • 前缀:pre(s, k) 为 s 前 k 个字符构成的子串
  • 后缀:suf(s, k) 为 s 后 k 个字符构成的子串
  • 任何子串都是某个后缀的前缀
  • 最长公共前缀 lcp(s, t):找出 s 和 t 最长的相同的前缀
  • 最长公共后缀 lcs(s, t)
  • 周期 (Period):
    • \(0 < p < |S|\)
    • \(s[i] = s[i + p], \forall i \in \{1,2,\dots,|s|-p\}\)
    • 满足以上条件,称 p 为 s 的周期
  • Border
    • \(0 < r < |S|\)
    • pre(s, r) = suf(s, r)
    • 满足以上条件,称 pre(s, r) 是 s 的 border
  • 周期与Border:pre(s, k)是 s 的 border 等价于 |s| - k 是 s 的周期

Border 的传递性

  • 串 s 是 t 的 border,串 t 是 r 的 border,那么 s 是 r 的border。
  • 串 s 是 r 的 border,串 t (|t| > |s|)也是 r 的 border,那么 s 是 t 的 border。
  • 记 mb(s) 表示 s 的最长 border
    • 则 mb(s), mb(mb(s)), ... 构成了 s 的所有 border
    • s 的所有 border 环环相扣,被 1 条链串起来

KMP 策略

调整 j 的位置(减小 j)使得性质“suf(pre(t, i), j) = pre(s, j)”。其中 t 为原串,s 为模式串。

next数组

  • next[j] = pre(s, j)的最长 border 长度 = mb(pre(s, j))
  • pre(s, j - 1)的所有 border 其实就是 next[j - 1], next[next[j - 1]], ...
  • 求next[j] 就是从 k = next[j - 1]开始检查 s[k + 1] = s[j] 是否成立,不成立就一直往前找 next (最长 border)

例题

  • 问题1:求字符串 A 的最短周期
    • 做法:根据 pre(A, k) 是 A 的 border 等价于 |A| - k 是 A 的周期,我们有 A 的最短周期 = |A| - A 的最长 border = N - next[N]
  • 问题2:给出字符串 A 和 B,求在 A 中最多能选出多少个互不重叠的 B 串
    • 做法:KMP找出所有next[j] = |B|的位置,从左到右贪心,能选则选

标签:pre,子串,定义,mb,next,KMP,border,性质
From: https://www.cnblogs.com/miraclepbc/p/17155396.html

相关文章

  • 参数化1、用户定义变量;2、用户参数
    1、添加配置元件->用户定义变量    2、测试计划中定义  3、添加前置处理器->用户参数  区别:1、用户定义变量启动时获取1次值,运行中值不变2、用户参数......
  • 【unity】基于Playable的自定义动画系统
    前言开发时逐渐对蜘蛛网动画系统中重复性的工作感到厌烦,而且当动画一多起来,即使蜘蛛网分了层,我仍然连看都不想看。遂寻求解决方案。蜘蛛网那一套系统不支持在运行时创建......
  • MyBatis_06(自定义映射resultMap)
    主题:自定义映射resultMap"自定义映射resultMap",可以解决什么问题:1-"属性"和"字段名"不一致的情况2-"多对一"的情况3-"一对多"的情况一、若"字段名"和"......
  • set的自定义排序
    看下面的代码就好了structcmp{ booloperator()(constpair<int,int>&a,constpair<int,int>&b)const{ intlena=a.second-a.first+1; intlenb=b.second-b.firs......
  • C# 自定义枚举类型转换
    //stringtoenumEAccountRolevar=(EAccountRole)Enum.Parse(typeof(EAccountRole),RoleManage.Instance.CurrentAccount.Role); //enumtolistpublicIEnumer......
  • [keil] 将函数定义到RAM运行,和定义无初始化变量(软复位,变量不清空)
    keil链接文件​​一、将函数定义到RAM运行​​​​二、定义无初始化变量(软复位,变量不清空)​​先打开Keil工程配置,选择linker链接文件,取消自动生成,并编辑sct。如上图,定义......
  • 学习笔记 // KMP
    智力问我,为什么要学KMP呢?时间复杂度甚至不如字符串哈希!我说,智力,你要不猜猜为什么这个世界上有扩展KMP,但是没有扩展字符串哈希?考虑暴力匹配字符串串,我们以长串串中的......
  • 「AcWing学习记录」KMP
    AcWing831.KMP字符串原题链接1.暴力算法怎么做chars[N],p[M];for(inti=1;i+m-1<=n;i++){boolflag=true;for(intj=1;j<=m;j++)......
  • uni-app:自定义顶部导航栏(hbuilderx 3.7.3)
    一,代码:说明:我们使整个顶部导航栏透明,只保留一个退回上一页的按钮模板<!--自定义导航栏--><viewclass="navBarBox"style="position:fixed;top:0;z-index:......
  • WinForm中DataGridView的单元格的显示格式DefaultCellStyle.Format自定义DefaultCellS
    第一步:继承ICustomFormatter,IFormatProvider接口,并实现实例代码:ICustomFormatter,IFormatProvider接口实现类publicclassKmFormatProvider:ICustomFormatte......