【KMP算法】学习总结

news2024/11/18 3:47:13

说明

  1. 文章内容为对KMP算法的总结,以及力扣例题;
  2. 文章内容为个人的学习总结,如有错误,欢迎指正。

文章目录

  • 1. KMP算法
    • 1.1 算法步骤
    • 1.2 关于指针回退问题
  • 2 . LeetCode例题

1. KMP算法

1.1 算法步骤

KMP算法通常用于字符串的匹配,解题分两步:

  1. 构建模式串的next数组。
    一般来说next数组就是前缀表(不太准确,但差不多是那个意思)。next[i]表明当第i个元素不匹配时应该回退到哪个位置:
    比如第i个元素不匹配,此时应寻找i之前的子串的最长相同前后缀的长度,这个长度的值就是next[i-1]的值。
    例:aab当i指向‘b’是发生了失配,此时应寻找b之前的子串,即‘aa’的最长相同前后缀的长度(=1),也就是说此时i指针应回退到下标为1的位置继续比较
  2. 匹配
    即模式串与主串的匹配。两个指针i,j分别指向主串和模式串,若二者匹配则两个指针后移;若发生失配,则指向模式串的指针j进行回退,重新匹配。

1.2 关于指针回退问题

关于指针回退的问题,我梳理一下:
例如:

主串='aabaabaaf'
模式串='aabaaf'

在这里插入图片描述

  1. 匹配时,模式串的‘f’与主串的‘b’不匹配,此时模式串的指针应该回退,但是回退到哪个位置呢?KMP算法告诉我们应该回退到模式串‘b’的位置,为什么呢?

  2. 因为不匹配的‘f’之前的子串——‘aabaa’的最长相同前后缀长度为2,即‘b’的下标。‘f’失配,但是‘aabaa’是和主串相匹配的,也就是说模式串中的“aa”(下标为3,4)与主串中的“aa”(下标为3,4)是相匹配的,而且子串“aabaa”中,后缀“aa”有最长相同的前缀“aa”(下标为0,1),也就是说这个前缀“aa”(下标0,1)和主串中的“aa”(下标为3,4)也是相匹配的,所以无需重复比较,直接将指针回退到模式串的‘b’位置继续比较即可。
    在这里插入图片描述

  3. 所以next[i]中存储的是i以及i以前的子串的最长相同前后缀长度。那么当i发生失配时,就要找i以前(0~i-1)的子串的最长相同前后缀长度是多少,然后回退到这个位置。
    比如‘f’失配时,要找‘f’之前的子串的最长相同前后缀长度(aabaa的最长相同前后缀长度)

2 . LeetCode例题

28. 找出字符串中第一个匹配项的下标

class Solution {
public:
    int strStr(string haystack, string needle) {
        vector<int> next(needle.size(),0);
        getNext(next, needle); //创建needle的next数组
        
        int j=0;
        for(int i=0; i<haystack.size(); i++){
            while(j>0 && haystack[i]!=needle[j])
                j = next[j-1];//发生失配,j进行回退
            if(haystack[i] == needle[j])
                j++;
            if(j == needle.size())
                return (i - needle.size() +1);//主串中出现了模式串,返回第一次出现模式串的下标
        }
        return -1; //主串中没有出现模式串,返回-1
    }

    void getNext(vector<int>& next, string needle){
        int n = needle.size();
        int j = 0; //j指向前缀的末尾
        next[0] = 0;//初始化nums[0]
        for(int i=1; i<n; i++){//j从0开始,则i从1开始,i指向后缀的末尾,初始前后缀的长度都是1
            while(j>0 && needle[i]!=needle[j])
                j = next[j-1];//前后缀的末尾不匹配,j指针进行回退
                            //j指针的回退相当于减小前缀的长度,当前缀末尾和后缀末尾相同时,此时就找到了needle[i](包括needle[i])之前的最长相同前后缀的长度;否则最长相同前后缀长度为0
            if(needle[i] == needle[j]){
                j++; //前后缀末尾相同时,同时后移i,j指针
            }
            next[i] = j;//将j的位置赋值给next[i],表明第i个元素发生失配时应该回退到哪个位置
        }
    }
};

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

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

相关文章

福州大学《嵌入式系统综合设计》实验五:图像裁剪及尺寸变换

一、实验目的 在深度学习中&#xff0c;往往需要从一张大图中裁剪出一张张小图&#xff0c;以便适应网络输入图像的尺寸&#xff0c;这可以通过bmcv_image_crop函数实现。 实践中&#xff0c;经常需要对输入图像的尺寸进行调整&#xff0c;以适用于网络输入图片尺寸&#xff0…

vue中v-if与v-for的优先级?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue中v-if与v-for的优先级? 目录 v-if和v-for的优先级是什么&#xff1f; 一、作用 二、优先级…

RocketMQ保姆级教程

RocketMQ是阿里巴巴旗下一款开源的MQ框架&#xff0c;经历过双十一考验、Java编程语言实现&#xff0c;有非常好完整生态系统。RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件&#xff0c;支持事务消息、顺序消息、批量消息、定时消息、消息回溯等&#xff0c;总之…

AI绘画工具汇总:免费、简单易上手

欢迎来到魔法宝库&#xff0c;传递AIGC的前沿知识&#xff0c;做有格调的分享❗ 喜欢的话记得点个关注吧&#xff01; 提到AI绘画&#xff0c;许多人通常会想到Midjourney和Stable Diffusion等工具&#xff0c;然而&#xff0c;这些工具对于新手而言门槛较高&#xff0c;不太友…

20230511 Windows Ubuntu vscode remote-ssh 连接配置

参考 &#xff1a; VSCode SSH 连接远程ubuntu Linux 主机 VSCode通过Remote SSH扩展连接到内网Ubuntu主机 Ubuntu 安装 sudo apt-get install openssh-server vscode: 安装remote-ssh 插件 连接到服务器IP 免密登录的公钥密钥传递用filezillaUbuntu 和 Windows 文件互传 …

INFLOW:用于检测隐藏服务器的反向网络流水印

文章信息 论文题目&#xff1a;INFLOW: Inverse Network Flow Watermarking for Detecting Hidden Servers 期刊&#xff08;会议&#xff09;&#xff1a;IEEE INFOCOM 2018 - IEEE Conference on Computer Communications 级别&#xff1a;CCF A 文章链接&#xff1a;https:…

分布式篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、你知道哪些分布式事务解决方案?二、什么是二阶段提交?三、什么是三阶段提交?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你…

AMEYA360:瑞萨面向高端工业传感器系统推出高精度模拟前端的32位RX MCU

全球半导体解决方案供应商瑞萨电子&#xff08;TSE&#xff1a;6723&#xff09;宣布面向高端工业传感器系统推出一款全新RX产品——RX23E-B&#xff0c;扩展32位微控制器&#xff08;MCU&#xff09;产品线。新产品作为广受欢迎的RX产品家族的一员&#xff0c;具有高精度模拟前…

chatglm3部署使用

chatglm3部署使用 1.部署2.使用3.接入微信4.vue前端 1.部署 1.首先去github下载chatglm3代码。Huggingface下载模型一直失败&#xff0c;所以用阿里的魔塔社区下载。 git clone https://github.com/THUDM/ChatGLM3.git git clone https://www.modelscope.cn/ZhipuAI/chatglm3…

2022-1-25 机器人运动规划方法综述 航空学报

论文PDF abstract 随着应用场景的日益复杂&#xff0c;机器人对旨在生成无碰撞路径&#xff08;轨迹&#xff09;的自主运动规划技术的需求也变得更加迫 切。虽然目前已产生了大量适应于不同场景的规划算法&#xff0c;但如何妥善地对现有成果进行归类&#xff0c;并分析不同…

Linux MYSQL-5.7.23-rpm安装(附带安装包)

系统环境 OS 版本(Linux) CentOS-7-x86_64-Minimal-1511Java版本 jdk1.7及以上 卸载系统自带mariadb-lib rpm -qa|grep mariadbrpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps解压tar包 tar -xvf mysql*.tar以下加粗rpm包需要安装&#xff1a; mysql-community-common…

求解Beamforming-SOCP(CVX求解)

时间&#xff1a;2023年11月23日14:00:16&#xff1a; 直接上代码&#xff08;辛苦两天才改出来的&#xff09; clear all; K 4; %user number N4; %base station number var1e-9; H []; %initialize H matrix for i1:Kh 1/sqrt(2*K)*mvnrnd(zeros(N,1),eye(N),1)1i/sqrt(2*…

【运动规划】191 自适应跟踪kinodynamicrrt的路径

分层法&#xff1a; two layer approach 自适应控制&#xff0c;跟随轨迹。运动规划&#xff1a;扩展自由空间&#xff08;基于速度约束缩小自由空间&#xff09;为控制部分留余量&#xff0c;确保安全。 控制设计&#xff1a; 考虑平移和旋转&#xff0c;速度环控制&#xff…

postgreSQL如何快速查询大表数据量

文章目录 场景方案结果 场景 我有一个非常大的表&#xff0c;估计几百万或者几千万。 我开始使用了 select count(*) from my_table_javapub 方式&#xff0c;查询非常慢。 如何解决&#xff1f;&#xff1f;&#xff1f; 方案 如果你需要更快地获取表中的行数&#xff0c…

Python爬取京东商品销售数据进行数据分析示例代码,以口红为例

文章目录 一、准备工作驱动安装模块使用与介绍 二、流程解析三、完整代码四、效果展示关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资…

windows server-修改管理员登录密码-远程访问

文章目录 1.打开服务器远程桌面2.修改计算机密码3.远程桌面登录 1.打开服务器远程桌面 允许远程连接到此计算机。 2.修改计算机密码 打开计算机管理>本地用户和组>修改管理员密码>重启。如下图所示&#xff1a; 3.远程桌面登录 打开远程桌面连接。输入ip&…

关于APP备案的通知以及APP备案的常见问题

前言 众所周知今年8月份&#xff0c;工信部出台了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;APP开发者的影晌是显而易见的。开发者需要按照要求提交相关材料进行备案&#xff0c;这无疑增加了开发者的时间和精力成本。虽然备案制度会增加开发者…

计网(复习自用)

计算机网络 1.概述 1.1概念 含义 计算机网络&#xff1a;是一个将分散的。具有独立功能的计算机系统&#xff0c;通过通信设备和线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 简单点说&#xff0c;计算机网络是互联的&#xff0c;自治的计算机集…

为何设计师都在用这个原型样机资源网站?

谈论原型样机素材模板&#xff0c;这个话题对设计师来说如同老朋友一般熟悉。设计师们在创作完毕后&#xff0c;为了更淋漓尽致地展示他们的设计成果&#xff0c;通常会将其放置在真实的样机素材模板中。这种原型样机素材可以让设计作品迅速且清晰地呈现在真实环境中。找到一个…

springboot_vue知识点

代码放到了仓库。 springboot_vue知识点 1.搭建1.vue2.springboot 2.前后端请求和响应的封装1.请求封装2.响应封装 3.增删改查1.查询2.分页3.新增和编辑4.删除 4.跨域和自定义异常5.JWT鉴权1.配置pom2.拦截前端请求的拦截器3.生成token并验证token4.登录后生成token5.前端获取…