首页 > 其他分享 >学习笔记——KMP模式匹配

学习笔记——KMP模式匹配

时间:2024-01-20 17:15:49浏览次数:27  
标签:right 匹配 笔记 next sim KMP 模式匹配 left

KMP模式匹配

KMP 算法能够在线性时间内判定字符串 \(A\left[1\sim N\right]\) 是否是字符串 \(B\left[ 1 \sim M\right]\) 的字串,并求出字符串 \(A\) 在字符串 \(B\) 中各次出现的位置。
详细来讲,KMP 算法分为两步。

  1. 对字符串 \(A\) 进行自我匹配求出一个数组 \(next\),\(next\left[i\right]\) 表示 \(A\) 中以 \(i\) 结尾的非前缀字串与 \(A\) 的前缀能匹配的最大长度。特别地当不存在这样的 \(j\) 时,\(next\left[i\right]\) 为 \(0\),即:
    \(next\left[i\right] = \max\{j\}\),其中 \(j < i\) 且 \(A\left[i-j+1 \sim i\right] = A\left[1\sim j\right]\)
  2. 对字符串 \(A\) 与 \(B\) 进行匹配求出一个数组 \(f\),其中 \(f\left[i\right]\) 表示 \(B\) 中以 \(i\) 结尾的字串与 \(A\) 的前缀能匹配的最大长度,即:
    \(f\left[i\right] = \max\{j\}\),其中 \(j\le i\) 且 \(B\left[i-j+1\sim i\right] = A\left[1\sim j\right]\)
    整个算法时间复杂度为 \(\mathcal{O}(N + M)\)。

\(next\) 数组的求法

  1. 初始化 \(next\left[1\right] = j = 0\),假设 \(next\left[1\sim i-1\right]\) 已求出,求解 \(next\left[i\right]\)。
  2. 不断尝试扩展匹配长度 \(j\),如果扩展失败即下一个字符不相等,则令 \(j=next\left[j\right]\),直至 \(j=0\),应该重新从头开始匹配。
  3. 如果扩展成功,匹配长度 \(j\) 就加一,\(next\left[i\right]\) 的值就是 \(j\)。
nxt[1]=0;
for(int i=2,j=0;i<=n;i++){
    while(j&&a[i]!=a[j+1])j=nxt[j];
    if(a[i]==a[j+1])j++;
    nxt[i]=j;
}

\(f\) 数组的求法

与求解 \(next\) 数组基本一致。

for(int i=1,j=0;i<=m;i++){
    while(j&&(j==n||b[i]!=a[j+1]))j=nxt[j];
    if(b[i]==a[j+1])j++;
    f[i]=j;
}

标签:right,匹配,笔记,next,sim,KMP,模式匹配,left
From: https://www.cnblogs.com/MithrilSwordXIV/p/17976737

相关文章

  • Check for balanced parentheses using stack【1月20日学习笔记】
    点击查看代码//Checkforbalancedparenthesesusingstack#include<iostream>#include<stack>//stackfromstandardtemplatelibrary(STL)#include<string>usingnamespacestd;boolarepair(charopening,charclosing){ if(opening=='(&#......
  • 关于SQL-case when最全面的学习笔记
    原文zhuanlan.zhihu.com/p/110198759?from_voters_page=truecasewhen推荐学习书籍:1、SQL基础教程6-32、SQL进阶教程1-1casewhen是SQL语法中提供的标准的条件分支。条件分支在MYSQL中即为IF函数,不同的数据库都会提供自己的一些函数,但是CASEWHEN更加通用。CASE语句......
  • KMP
    KMPvoidgetnext(char*p){intlenp=strlen(p);nextt[0]=-1;intk=-1;intj=0;while(j<lenp-1){//p[k]表示前缀,p[j]表示后缀(并没有“真”!)if(k==-1||p[j]==p[k])//j在这{j++;//j+1在这k++;//k=k+1//---->若......
  • 嵌入式系统开发笔记
    嵌入式概念:是应用为中心,以计算机技术为基础,软硬件可裁剪,对功耗、体积、可靠性、成本都有严格要求的专用计算机系统。内存寻址独立寻址:片内片外存储器只能选择其中一个(芯片内部有标志引脚,使用高低电平来表示读取片内或者片外)统一寻址:片内片外存储器都能使用,且使用的是同一片连续的寻......
  • 二项式反演学习笔记
    前置知识二项式定理:\((a+b)^n=\sum_{i=0}^n\binom{n}{i}a^ib^{n-i}\)。二项式反演反演公式1:\[f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\iffg(n)=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)\]证明:\[\begin{aligned}\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)&=\sum_{i=0......
  • 积性函数学习笔记
    积性函数定义积性函数:\(f(x)\)满足\(\forall\gcd(a,b)=1,f(ab)=f(a)f(b)\)若没有\(\gcd(a,b)=1\)的性质,则为完全积性函数。性质性质1:\(f(x),g(x)\)是积性函数\(\implies\)\(f\timesg\)是积性函数,\(f\divg\)是积性函数证明略。性质2:狄利克雷(Dirichlet)卷积\(......
  • 欧拉定理学习笔记
    费马小定理\(a,p\in\mathbb{Z_+}\),\(p\)为质数,\(\gcd(a,p)=1\)。定理:\(a^{p-1}\equiv1\pmodp\)。证明:考虑下面两个整数集合:\[A=\{x\in\mathbb{Z_+}|1\lex<p\}\]\[B=\{y\in\mathbb{Z_+}|y=ax,x\inA\}\]\(A\)中很明显每个数对\(p\)取余各不相同......
  • 莫比乌斯反演学习笔记
    前置知识狄利克雷卷积:\(f*g=\sum_{d|n}f(d)g(\frac{n}{d})\)。积性函数,线性筛。数论分块。单位函数:\(\varepsilon(n)=[n=1]\)。(积性函数)常数函数:\(1(n)=1\)。(积性函数)莫比乌斯函数引理1:\(f(n)\)是积性函数等价于\(g(n)=\sum_{d|n}f(d)\)是积性函数。证明:显然,\(g=......
  • 容斥学习笔记
    目录容斥原理Min-Max容斥广义容斥原理容斥原理原理:\[|\bigcup_{i=1}^nA_i|=\sum_{j=1}^n(-1)^{j-1}\sum_{a_k\not=a_{k+1}}\bigcap_{l=1}^mA_{a_i}\]这东西学过小学奥数就会了。一些有用的结论:\[|\bigcap_{i=1}^nA_i|=|\Omega|-|\bigcup_{i=1}^n\overline{A_i......
  • 杜教筛学习笔记
    原理前置知识:积性函数,狄利克雷卷积。杜教筛可以在亚线性的时间内算出某些函数的前缀和。假设我们要算出函数\(f\)的前缀和,我们要找到函数\(g\),记\(f*g=h\)。杜教筛的前提是\(g\)的前缀和与\(h\)的前缀和都可以快速计算,我们可以快速计算\(f\)的前缀和。首先,我们考......