【KMP】优质模板推荐+解读

KMP – y神模板

引言:由于本人与4月20日前周五的一节数据结构课中偶然听到了老师讲kmp这个算法的概念并且发现老师讲的听不懂一点儿导致异常难受,于是花了两天左右自行弄懂了kmp算法的逻辑,并写下本文以便以后复习,并作留念。

声明:本文仅供对kmp理解的人扩展思路,不能教会不会kmp算法的人kmp的理解核心 Σ(っ °Д °;)っ

还不会kmp?:以下学习资料(教程链接)助你速通,

  1. 大神左程云细说kmp
  2. kmp简单讲解动画
  3. 民间讲解教程
  4. AcWing算法基础课–第二单元内容(需要付费)

题目练习

一、next数组快速生成

#include <iostream>using namespace std;const int N = 1e5+1, M = 1e6+1;
char s[M], p[N];
int n, m, ne[N];int main() {cin >> n >> p+1 >> m >> s+1;// 创建next数组代码:for (int i = 2, j = 0; i <= n; i ++) {while (j && p[i] != p[j+1]) j = ne[j];if (p[i] == p[j+1]) j ++;ne[i] = j;}// kmp匹配代码:/*暂时省略*/return 0;
}

前置条件的解释

对于代码中的变量名,这里进行解释:

变量名含义
s主串
p模式串(需要在主串中被匹配并找到位置)
n模式串长度
m主串长度
i当前需要求的next数组下标位置
ji位置字符回溯后的位置

对于本模板需要注意三个小的细节:

  1. 输出输出的字符下标都是从1开始存储,0位置置空
  2. 每次比对时都是比对s串的i下标和p串的j+1位下标
  3. 回溯:也是kmp和暴力匹配的本质区别,在于匹配失败,instead of i向后移动,but j 向前移动我称之为"回溯",注意和递归那个回溯本质不是同一个东西。

如图所示:

在这里插入图片描述

对于模式串ababab在字符数组中的存储情况如上。

代码图示解读

for循环

对于代码:

for (int i = 2, j = 0; i <= n; i ++)

ij的默认位置如图所示:
在这里插入图片描述

解释:

细节对应的原理
i=2i=1位置的相等前后缀最大长度一定是0
next数组中默认都为0
所以i直接跳过第一位即可
j=0每一次都比较j+1i位置是否相等,
最开始也就是第一次迭代需要求i=2位置next数组的值,
那么就需要比较j=1i=2位置在模式串p中字符是否相等
i<=n这个简单,越过n就超过模式串p的长度了,同时也就表明next数组计算完毕。
for循环中后半部分代码(比较简单放在前面)
if (p[i] == p[j+1]) j ++;
ne[i] = j;

这段代码的含义:如果i位置字符和j+1位置字符相等,j后移一位,并且计算出了nexti位置的值。

如图:

在这里插入图片描述

for循环中第一句
while (j && p[i] != p[j+1]) j = ne[j];

如果不相等,使用ne(变量名冲突所以不适用next)数组回退。

二、kmp匹配部分

#include <iostream>using namespace std;const int N = 1e5+1, M = 1e6+1;
char s[M], p[N];
int n, m, ne[N];int main() {cin >> n >> p+1 >> m >> s+1;// create nextArray.for (int i = 2, j = 0; i <= n; i ++) {while (j && p[i] != p[j+1]) j = ne[j];if (p[i] == p[j+1]) j ++;ne[i] = j;}// kmp.for (int i = 1, j = 0; i <= m; i ++) {while (j && s[i] != p[j+1]) j = ne[j];if (s[i] == p[j+1]) j ++;if (j == n) {cout << i - n << ' ';j = ne[j];}}return 0;
}

每次进行匹配,

  • 如果匹配成功j++

  • 如果匹配不成功,并且j还有向前回溯的可能,则回溯j = ne[j]

  • 如果已经匹配出一个结果,j == n,打印这个子串的初始位置,并且向前回溯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636293.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构10:堆和堆排序

文章目录 树的概念及结构树的概念树的相关概念树的表示树在实际中的应用表示文件系统的目录树结构 二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 堆的实现堆的插入堆的删除堆的创建向…

8.1 二叉排序树 —— C语言实现

系列文章目录 参考船说系列——数据结构与算法中的第八章内容。 二叉排序树AVL树红黑树B-树 文章目录 系列文章目录前言一、二叉排序树基础二、二叉排序树的操作2.1 插入2.2 删除 三、代码演示总结参考文献 前言 数据结构 结构定义 结构操作 结构操作是用来维护结构性质的…

spring高级篇(二)

1、Aware和InitializingBean Aware和InitializingBean都与Bean的生命周期管理相关。 Aware接口: 概念: Aware接口是Spring框架中的一个标记接口&#xff0c;它表示一个类能够感知到&#xff08;aware of&#xff09;Spring容器的存在及其特定的环境。Spring框架提供了多个Awar…

自然语言处理基础面试

文章目录 TF-IDFbag-of-wordsBert 讲道理肯定还得有Transformer&#xff0c;我这边先放着&#xff0c;以后再加吧。 TF-IDF TF&#xff08;全称TermFrequency&#xff09;&#xff0c;中文含义词频&#xff0c;简单理解就是关键词出现在网页当中的频次。 IDF&#xff08;全称…

【Pytorch】PytorchCPU版或GPU报错异常处理(10X~4090D)

Pytorch为CPU版或GPU使用报错异常处理 文章目录 Pytorch为CPU版或GPU使用报错异常处理0.检查阶段1. 在conda虚拟环境中安装了torch2.卸载cpuonly3.从tsinghua清华源安装不完善误为cpu版本4.用tsinghua清华源安装成cpu错误版本5.conda中torch/vision/cudatoolkit版本与本机cuda版…

Python基础学习之**kwargs

在Python编程中&#xff0c;**kwargs 是一个强大的工具&#xff0c;它允许我们在函数定义中接受任意数量的关键字参数。kwargs 是 "keyword arguments" 的缩写&#xff0c;实际上是一个字典&#xff0c;其中包含了传递给函数的所有关键字参数。本文将详细介绍 **kwar…

文本美学:text-image打造视觉吸引力

当我最近浏览 GitHub 时&#xff0c;偶然发现了一个项目&#xff0c;它能够将文字、图片和视频转化为文本&#xff0c;我觉得非常有趣。于是我就花了一些时间了解了一下&#xff0c;发现它的使用也非常简单方便。今天我打算和家人们分享这个发现。 项目介绍 话不多说&#xf…

用或非门构成的基本触发器

用或非门构成的基本触发器 电路组成 & 逻辑符号 注意&#xff1a;与用与非门构成的基本触发器相比&#xff0c;不仅 R 、 S R、S R、S 的几何位置不同&#xff0c;而且其上无反号&#xff0c;即高电平有效&#xff0c; Q Q Q 和 Q ‾ \overline{Q} Q​ 仍表示触发器的状…

最短路问题之Bellman-Ford,SPFA算法,例题 负环

Bellman-Ford算法&#xff1a; Bellman-Ford算法用于解决带有负权边的单源最短路径问题。其基本思想是通过不断地松弛边来逐步求解最短路径。算法的主要步骤如下&#xff1a; 初始化&#xff1a;将源点到各个顶点的距离初始化为无穷大&#xff0c;源点的距离初始化为0。重复更…

Linux使用Libevent库实现一个网页服务器---C语言程序

Web服务器 这一个库的实现 其他的知识都是这一个专栏里面的文章 实际使用 编译的时候需要有一个libevent库 gcc httpserv.c -o httpserv -levent实际使用的时候需要指定端口以及共享的目录 ./httpserv 80 .这一个函数会吧这一个文件夹下面的所有文件共享出去 实际的效果, 这…

关于电商独立站搭建中电商API数据采集接口的应用

搭建供应链系统时&#xff0c;您可能需要与电商平台进行集成&#xff0c;以实现订单管理、库存同步、物流跟踪等功能。以下是一些常见的电商接口&#xff0c;可以帮助您构建供应链系统&#xff1a; 1. **淘宝开放平台接口**&#xff1a;淘宝开放平台提供了丰富的接口&#xff…

【VSLAM】VINO-Mono安装部署与运行

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍VINO-Mono安装部署与运行。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…