KMP算法【一句话概括什么是KMP】【手写 求next数组】【手写匹配过程】

news2025/7/19 15:42:14

这里写自定义目录标题

  • 1. 什么是KMP算法
  • 2. next数组的表示含义+怎么算
  • 3. 匹配过程
  • 例题——KMP字符串

1. 什么是KMP算法

KMP算法:给定abcabm字符串和abcabcabm字符串,求前面字符串在后面字符串出现的位置,我们从头开始依次遍历,当遍历到m!=c时候,本来应该再次从后面字符串的第二个位置从头开始遍历,但是kmp算法可以帮助我们直接从如下图开始再次遍历
在这里插入图片描述
为什么会出现如此操作?
原因是,我们先处理一遍要遍历的数组abcabm,然后再每个位置上存储一个角标,如果该位置出现匹配失败,那么我们就从该位置存储的角标处再重新遍历

那么此数组如何处理的?

2. next数组的表示含义+怎么算

next数组表示的是,字符串中,前缀和后缀相等的个数(前缀不算最前面的自己,后缀不算最后一个的自己)

aa 那么next[2] = 1 因为 a = a
aba 那么 next[3] = 1 因为 a = a
abab 那么 next[4] = 2 因为 ab = ab
aaa 那么 next[3] = 2 因为 jj = jj

算法如下
在这里插入图片描述
注意:

  1. j的大小 看前一个情况的变化而变化不一
  2. next[1] = 0,i从第二个开始求next
    具体看代码,自己画图自己才能悟明白
for(int i = 2, j = 0; i <= m; i++)
{
    while(j && p[i] != p[j+1]) j = next[j];

    if(p[i] == p[j+1]) j++;

    next[i] = j;
}

3. 匹配过程

在这里插入图片描述

    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)
        {
            printf("%d ", i - n);
            j = ne[j];
        }
    }
  1. j 为什么从0开始?因为j要+1
  2. if (s[i] == p[j + 1])这个哪里来的?因为j回到起始位置,但第二个字符并没有去匹配,所以需要匹配一下

例题——KMP字符串

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Supervisor - 用户进程监控利器

Supervisor Supervisor 是一个客户端/服务器系统&#xff0c;允许用户在UNIX操作系统上监视、控制用户进程。从定义里面分析包含两层意思。 监控进程 - 监控进程状态 确定当前进程是否发生异常控制进程 - 针对进程异常情况 控制进程的行为 如重启当前进程 Supervisor 通过 F…

神经网络和深度学习-logistic回归

logistic回归 logistic回归常用于分类问题 &#xff0c;根据输入的x来估计属于不同类的概率为多少&#xff0c;满足分布&#xff0c;即所有类的概率总和为1 在torchvison包中提供了一些常用的数据集&#xff0c;供我们使用&#xff0c;例如&#xff1a;Mnist数据集 Cifar-10数…

力扣算法入门刷题2

12、删除排序链表中的重复元素 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2[ //链表结构 public class ListNode {* int val;* List…

【情感识别】BP神经网络语音情感识别【含Matlab源码 349期】

⛄一、BP神经网络语音情感识别简介 0 引言 随着科技的迅速发展, 人机交互显得尤为重要。语音是语言的载体, 是人与人之间交流的重要媒介。相较于其它交流方式而言, 语音交流更加直接、便捷。近年来, 随着人机交互研究的不断深入, 语音情感识别更成为了学术界研究的热点, 其涉及…

3年测试经验,投了300多份简历,没公司要我...

前言 软件测试行业3年多经验&#xff0c;学历大专自考本科&#xff0c;主要测试方向web&#xff0c;PC端&#xff0c;wap站&#xff0c;小程序公众号都测试过&#xff0c;app也测过一些&#xff0c;C端B端都有&#xff0c;除功能外&#xff0c;接口性能也有涉猎&#xff0c;但…

一条命令能实现前端本地代码和打包仓库的自动化提交?

背景&#xff1a; 先介绍我们原本的代码上线流程&#xff1a;首先发布仓和代码仓&#xff08;dev和master分支对应测试和生产环境&#xff09;独立&#xff0c;每次修复或新增功能&#xff0c;首先需要提交改动到代码仓&#xff08;fork&#xff09;&#xff0c;然后打包代码&…

TI Sitara系列 AM64x开发板——FreeRTOS、Baremetal案例开发案例

前 言 3 1 开发环境搭建 2 CCS工程编译与加载 3 FreeRTOS与Baremetal案例 评估板简介 创龙科技TL62x-EVM是一款基于TI Sitara系列AM62x单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F异构多核处理器设计的高性能低功耗工业评估板,由核心板和评估底板组成。处理器ARM Cor…

SpringCloud之微服务实用篇2

在之前我们学习微服务中的两个组件&#xff0c;一个是注册中心&#xff0c;一个负载均衡器。今天&#xff0c;我们主要学习三个内容&#xff0c;分别是&#xff1a;Nacos配置管理、Feign远程调用、Gateway服务网关。 目录 一、Nacos配置管理 1.1、Nacos实现配置管理 1.2、微…

Redis持久化策略AOF、RDB详解及源码分析

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、Redis为什么要持久化 Redis 是一个内存数据库&#xff0c;就是将数据库中的内容保存在内存中&#xff0c;这与传统的MySQL&#xff0c;Oracle等关系型数据库直接将内容保存到硬盘中相比&#xff0c;内存数据库的读写效…

数论简单问题

数论基本问题约数个数问题约数之和问题1-n中所有1-n因子的数量n!分解后某个质因子的个数欧拉函数公式法求欧拉函数线性筛求欧拉函数欧拉函数在线性筛中的三种情况&#xff1a;欧拉定理逆元费马定理求逆元快速幂求逆元扩展欧几里得算法扩展欧几里得算法证明扩展欧几里得的应用中…

消息队列 - RabbitMQ

1. 名词解释 Producer&#xff1a;生产者 Broker&#xff1a;接收和分发消息的应用 Connection&#xff1a;生产者和消费者与 Broker 之间的 TCP 连接 Channel&#xff1a;信道&#xff1b;在 Connection 内部建立的逻辑连接&#xff0c;每个 Channel 之间是相互隔离的。相…

第十四届模拟赛第二期试题【Java解析】

目录 ✏️写在前面 ✨历史回顾 &#x1f388;第一题&#xff08;二进制API&#xff09; 代码&#xff1a; 思路&#xff1a; &#x1f388;第二题&#xff08;闰年问题/时间API&#xff09; 代码1&#xff1a; 思路1&#xff1a; 代码2&#xff1a; 思路2&#xff1a…

【计算机网络】数据链路层:使用点对点信道的数据链路层

数据链路层信道类型&#xff1a; &#xff08;1&#xff09;点对点信道&#xff1a;使用一对一的点对点通信方式 &#xff08;2&#xff09;广播信道&#xff1a;使用一对多的广播通信方式。 必须使用专用的共享信道协议来协调主机数据发送。 链路:从一个节点到相邻节点的一…

TCP的三次握手和四次挥手

目录:smile_cat:基础知识回顾1、运输层概述2、端口号3、复用与分用:smiley_cat:重点知识来袭1、TCP和UDP2、三次握手3、四次挥手4、TCP报文段首部格式文章参考来源&#xff1a; TCP的三次握手和挥手–飞天小牛肉20-1-tcp连接——初始化序列号(ISN)_网络安全-CSDN博客_初始序列…

掌握分布式环境缓存更新策略,提高缓存与数据库数据一致性

概述 随着时代的发展&#xff0c;服务系统架构也已经由最初的单体架构转变为分布式、微服务架构模式。 从数据体量上来看&#xff0c;各系统存储的数据量越来越大&#xff0c;数据的查询性能越来越低。 此时&#xff0c;就需要我们不断的进行优化&#xff0c;最常用的就是引入…

NVIDIA RTX3090上安装tensorflow-gpu 1.12.0

目录 项目场景&#xff1a; 问题描述1 CUDA版本不匹配&#xff0c;需要重新安装 解决方案1&#xff1a; 额外安装其他版本的CUDA&#xff0c;并实现版本自由切换。 问题描述2&#xff1a; 1. cuDNN包解压后的cudnn.h文件无法复制到目标文件夹中 2. 如何查看是否会到最初…

计算机系统基础期末复习

C语言代码如下&#xff1a; void fun(int n){ int x n*12;int y n/32; }请将其中计算的部分优化为位运算、移位运算和加法运算的结合。 x n8n4 (n<<3)(n<<2) x (n(n>>31) & 0x1F)>>5 设32位的位串为x(x类型为unsigned int)&#xff0c;现要…

python dingding --- 钉钉机器人API

dingding — 钉钉机器人 github 源码地址&#xff1a;https://github.com/zly717216/dingding 一、模块介绍 版本号 dingding: V1.0.0 功能 当前版本支持群机器人相关API调用&#xff0c;包括发送文本消息、文本链接、markdown、整体跳转 ActionCard、独立跳转 ActionCar…

【MindSpore】DCGAN生成漫画头像-----利用华为云modelarts云终端实现

前言 本人对于 mindspore 一点也不熟悉 但是 对于 学习新事物的心情和动力 一直都很澎湃 本次参加 mindSpore 的 DCGAN生成漫画头像 社区活动&#xff0c;希望能够增长见识 关注 证明图 使用工具 我直接使用的 mindSpore 提供的在线云环境 的终端来 体验 这一次的任务训练 …

【Autopsy数字取证篇】Autopsy数字取证软件的下载安装与优化配置

【Autopsy数字取证篇】Autopsy数字取证软件的下载安装与优化配置 Autopsy是一款免费开源的优秀数字取证&#xff08;Digital Forensics&#xff09;软件&#xff0c;提供与其他数字取证工具相同的核心功能&#xff0c;并提供其他商业工具不提供的其他基本功能&#xff0c;例如…