首页 > 其他分享 >KMP & ACAM

KMP & ACAM

时间:2023-12-15 22:00:11浏览次数:29  
标签:右移 遍历 匹配 int ACAM KMP

KMP

例:在a串中查找b串的位置。(len <= 1e6)

O(n2)的暴力是好想的。两层循环,第一层遍历a串,第二层遍历b串,对应比较即可。

但我们会发现对于a串,我们每次都不断将循环变量i右移,可匹配失败后,又将i返回至右移之前的位置。

太劣了,所以我们选择取消i的返回操作,每次用b串去匹配a串。

但当b失配时,我们不能直接将b串循环变量归零,否则会有遗漏。

对于b串的适配位置j,b[1……j-1]都已匹配成功,此时我们选择断臂自救。

将j左移,直至b[1……j]再次与a串匹配成功,显然匹配成功的子串变小了。

这就是我们要找的最长公共前后缀。用kmp[i]表示b[1……i]的最长公共前后缀。

lb = strlen(b + 1);
int j = 0;
for(int i = 2; i <= lb; i++){
    while(j && b[j + 1] != b[i]) j = kmp[j];
    if(b[j + 1] == b[i]) j++;
    kmp[i] = j;    
}

 

标签:右移,遍历,匹配,int,ACAM,KMP
From: https://www.cnblogs.com/Peng1984729/p/17904251.html

相关文章

  • 【kmp算法】字符串匹配
    一,解决问题kmp算法解决的是字符串匹配的问题,具体来说假定我们要在主串s[]中匹配模式串p[],找到匹配到的位置loc;二,具体实现和演变过程最自然的想法是暴力写法(BF)枚举主串字符s[i],和模式串p[j]。一个一个匹配,如果匹配失败,i指针回退回起点,往前进一位,再次进行比较,......
  • KMP 学习笔记
    符号规定先来规定一些符号。\(\lvertS\rvert\)代表这个字符串\(S\)的长度。\(S_{l\cdotsr}\)代表字符串从第\(l\)个字符到第\(r\)个字符组成的字串。\(F(S,i)\)等同于\(S_{1\cdotsi}\)(就是字符串长度为\(i\)的前缀)\(E(S,i)\)等同于\(S_{\lvertS\rvert-i+1......
  • KMP
    KMP算法实现KMP串匹配主要分为两个步骤,即获得match数组(或者说next数组),然后应用match数组来进行串匹配的简化获取match数组KMP的精髓就在于使用match数组使得i指针不需回退,使得暴力的m*n的时间复杂度变为m+n的时间复杂度,其中的m指的就是求match数组的复杂度。match数组......
  • KMP算法
    1.暴力匹配暴力匹配算法的步骤如下:遍历主串中的每个可能的起始位置,从第一个字符开始。对于每个起始位置,逐个比较主串和模式串中对应位置的字符。如果发现不匹配的字符,即主串和模式串中对应位置的字符不相等,将模式串向右移动一个位置,继续比较。如果模式串完全匹配主串中的一......
  • KMP
    简介KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。实现构造next[]数组前缀:除最后一个字符外,......
  • 关于kmp模板
    那个求p串的next数组这个版本是下标从1开始的字符串,如果从0开始的话,可以在前面加空字符,然后p.size或者s.size的地方-1即可。nex[1]=0    for(inti=2,j=0;i<=p.size();i++){if(j&&p[i]!=p[j+1])j=nex[j];if(p[i]==p[j+1])j++;nex[i]=j;} kmp函数......
  • AcWing 831. KMP字符串
    题面:给定一个字符串S,以及一个模式串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串P在字符串S中多次作为子串出现。求出模式串P在字符串S中所有出现的位置的起始下标。原题链接:831.KMP字符串-AcWing核心:next数组-最长相等前后缀next[i]存储......
  • KMP字符串匹配算法 整理
    KMP整理题面视频详解KMP的作用KMP算法的主要作用是求出一个字符串(模式串)是否为另一个字符串(主串)的子串,并同时求出它出现的位置,也即字符串匹配问题。算法解析暴力先说暴力算法:从头开始枚举模式串位置的起点,然后遍历从起点往后\(m\)个字符,检查它是否与模式串完全相同......
  • KMP
    一、算法描述本篇文章水平不够,讲不清楚KMP到底是怎么回事,以后再更新一下。本篇文章讲述的是KMP算法,一个著名的字符串匹配算法,效率很高,\(O(n)\)的时间复杂度。难点在于:如何理解\(next[i]\)★★★\(ne[i]=j\)表示,\(p[1~j]=p[i-j+1,i]\),从\(1\)到\(j\)的前缀......
  • P3375 【模板】KMP( 普及/提高− ) 题解
    题目传送门思路:首先我们要学习一下\(KMP\)算法,不会的可以看这个大佬的文章那么我们就直接开始讲思路了。针对于每一位,\(kmp\)算法已经预处理出了一个对应\(kmp\)数组的单元,映射着如果此位失配,它可能的最靠后的一个重新开头是哪一个。让我们举一个例子:假如让\(aaab\)与......