首页 > 编程语言 >单模式匹配 KMP 算法 简易版学习笔记

单模式匹配 KMP 算法 简易版学习笔记

时间:2024-10-19 19:48:36浏览次数:1  
标签:... 前缀 后缀 公共 简易版 KMP pi 模式匹配

KMP

前缀函数

设 \(S_i\) 为字符串 \(S\) 的第 \(i\) 个位置。

我们设 \(\pi(i)\) 表示字符串以 \(i\) 结尾的前缀的最长公共前后缀的长度。

这里的前后缀都指的是真前缀、真后缀。

怎么 \(O(n)\) 求出 \(\pi(i)\)。

性质:相邻的 \(\pi\) 至多增加 1。

因此, 若 \(s[\pi(i)+1]=s[i+1]\) 时,\(\pi(i+1)=\pi(i)+1\)。

如果失配,我们要找到 \(i\) 前缀的第二长的公共前后缀,然后再次比较。以此类推。

那么

\[[s_1s_2s_3s_4]...[s_{i-3}s_{i-2}s_{i-1}s_{i}]s_{i+1} \]

如果 \(\pi(i)=4\),即 \(s[1...4]=s[i-3...i]\)。

而第二长的公共前后缀长度 \(j\),假如 \(j=2\),那么 \(s[1...2]=s[i-1...i]\)。

由于 \(s[1...4]=s[i-3...i]\),那么 \(s[i-1...i]=s[3...4]\),所以 \(s[1...2]=s[3...4]\)。

所以第二长的公共前后缀长度是前缀 \(\pi(i)\) 的最长公共前后缀长度,即 \(\pi(\pi(i))\)。

所以如果 \(\pi(i)+1\) 失配,那么就找到 \(\pi(\pi(i))+1\),然后是 \(\pi(\pi(\pi(i)))+1\dots\)

到最后找到 \(1\),若不相等则 \(\pi(i+1)=0\)。

KMP 算法

对于文本串 \(s\) 和模式串 \(t\) 匹配,可以求出字符串 \(t+\#+s\) 的前缀函数,其中 \(\#\) 是一个额外字符,然后就能知道 \(s\) 每个前缀能否与 \(t\) 匹配。

标签:...,前缀,后缀,公共,简易版,KMP,pi,模式匹配
From: https://www.cnblogs.com/dccy/p/18486446

相关文章

  • 考研数据结构-串(串的模式匹配算法)
             串的基本操作可以参照考研数据结构-串(串的基本操作),除去这些基本操作外,还有一个重要的操作就是串的模式匹配算法。模式匹配算法就是,对于一个串中某个子串的定位操作,这里会讲两种模式匹配算法:简单模式匹配算法和KMP算法。一、简单模式匹配算法   简单......
  • KMP
    KMPs1字符串是否包含s2字符串,如果包含返回s1中包含s2的最左开头位置,不包含返回-1暴力方法就是s1的每个位置都做开头,然后去匹配s2整体,时间复杂度O(n*m)KMP算法可以做到时间复杂度O(n+m)28.找出字符串中第一个匹配项的下标#include<iostream>#include<v......
  • JDK 21更新:switch语句的类型模式匹配与守卫模式
    Java语言自诞生以来,一直在不断演进,以满足开发者日益复杂的需求。switch语句作为一种控制流结构,在Java中有着广泛的应用。随着JDK21的发布,switch语句和表达式得到了显著增强,使其在处理复杂条件和类型检查方面更加灵活和强大。本文将详细探讨JDK21中switch语句和表达式的更......
  • KMP
    一个kmp学了\(n\)遍终于学懂的屑菜bot。下文默认文本串为\(s\),模式串为\(t\)。前缀函数定义\(\pi_i\)表示前缀为\(i\)的子串中的最长公共前后缀(border)长度。不难发现,将文本串接在模式串后,中间隔一个特殊字符,若出现\(\pi_i=|t|\)的情况则说明匹配成功了。求取......
  • Z函数(扩展KMP)
    扩展KMP(Z函数)Z数组简单理解\(Z[i]\)表示字符串从i出发,与整体相比有多长的公共前缀aaabaac7210210可以先理解马拉车再来看首先,设置两个类似的东西,关键点\(c\)和最右边界\(r\),表示\(Z[c]\)是目前所有\(Z\)中,\(i+Z[i]\)最右边的那个对于: r01......
  • 对KMP算法的疑问与理解
    对KMP算法的疑问与理解核心:在逐字符遍历主串与模式串的过程中,发生失配时,不回溯主串的i字符指针,而是通过确定已经匹配过的模式串的子串的前缀集合与后缀集合的交集中最长元素的长度,来移动模式串的j字符指针,实现模式串的整体向右滑动,跳过绝不可能发生的字符串匹配,以此实现......
  • [NOI2014] 动物园——KMP 倍增
    [NOI2014]动物园题目描述近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。某天,园长给动物们讲解KMP算法。园长:“对于一个字符串\(S\),它......
  • AI 推理能力大“翻车”!苹果最新论文:LLM只是复杂的模式匹配,而不是真正的逻辑推理
    内容提要大语言模型真的可以推理吗?LLM都是“参数匹配大师”?苹果研究员质疑LLM推理能力,称其“不堪一击”!文章正文苹果的研究员MehrdadFarajtabar等人最近发表了一篇论文,对大型语言模型(LLM)的推理能力提出了尖锐的质疑,他认为,LLM的“推理”能力,其实只是复杂的模式匹......
  • kmp算法模板
    voidkmp(){n=strlen(s+1);//s是目标串m=strlen(p+1);//p是模板串//nxt预处理开始intj=0;nxt[1]=0;for(inti=2;i<=m;i++){while(j>0&&p[j+1]!=p[i])/*判断当前子串的前后缀相等的长度是否能增......
  • KMP循环节
    KMP循环节在icpc2019ChinaCollegiateProgrammingContestQinhuangdaoOnsiteJ.MUVLUVEXTRA由题易得,要求这个数的小数部分的\(S=a×循环长度−b×循环节的长度\),让这个S尽可能的大。又因为对于循环长度我们可以用kmp算法来求出最小循环节,所以我们可以枚举循环长度......