KMP算法(相关题目:leetcode28题)

KMP算法原理 什么是KMP 三位学者发明的:Knuth,Morris和Pratt算法 KMP有什么用 KMP主要应用在字符串匹配上。 KMP的主要思想是「当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头开始再去做匹配了。」 那么如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。 前缀表 next数组就是一个前缀表(prefix table)。 前缀表有什么作用呢? 「前缀表是用来回溯的,意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。 阅读详情

1. 解决的问题:解决字符串匹配问题。(换言之,判断一个字符串“原串”里面是否包含另一个字符串“模式串”)

2. 简介: Knuth-Morris-Pratt(简称KMP)算法,是三个发明者名字首字母。

3. 举例:原串 str = ABAFCDABAFDCC,索引为 i,模式串 tar = ABAFD,索引为 j

这里需要先说一下暴力算法:

比较两个字符串的第一个元素 str[1] 和 tar[1],一样,继续比较下一个str[2] 和 tar[2]:

第二个字符一样,继续比较下一个:

一直到第五个元素,发现不一样,这时模式串整体后移一位,重新比较模式串的第一个元素与原串的第二个元素是否一样:

总结:以上就是暴力算法,只要发现不一样的字符,模式串就要整体后移一位,然后再从头逐个比较,效率很低。KMP算法是后移多位,然后从模式串的索引为 j 的字符继续比较。

在说KMP算法之前需要先了解几个概念:前缀、后缀、最大相等前后缀长度。

前缀:除最后一个字符的其他字符的组合。

后缀:除第一个字符的其他字符的组合。

以ABFAB为例,

A的前缀和A的后缀都是空集,所以最大相等前后缀长度为0;

AB的前缀有:A;AB的后缀有:B;没有交集,所以最大相等前后缀长度为0;

ABF的前缀有:A、AB;ABF的后缀有:F、BF;没有交集,所以最大相等前后缀长度为0;

ABFA的前缀有:A、AB、ABF;ABFA的后缀有:A、FA、BFA;交集是A,所以最大相等前后缀长度为1;

ABFAB的前缀有:A、AB、ABF、ABFA;ABFAB的后缀有:B、AB、FAB、BFAB;

最后一行表示的是截止每个字符的字符串的最大相等前后缀长度,我们使用一个数组next来存储这些值。那么ABFAB的next数组就是{0,0,0,1,2}

4. KMP算法:

为什么KMP算法直接移动到这里呢?这就是第一个关键点:

移动位数 = j - next[j - 1],j = j - 移动位数;

代码如下:

public static int strStr(String haystack, String needle) {

        int i = 0;

        int j = 0;

        int N = 1;//移动位数

        if (haystack.equals(needle) || needle.length() == 0) return 0;

        if (needle.length() < 1 || haystack.length() < needle.length()) return -1;

        int[] next = getNext(needle);

        while (i < haystack.length()) {

            if (haystack.charAt(i) == needle.charAt(j)) {

                i++;

                j++;

                if(j == needle.length()) {

                    return i - j;

                }

            } else {

                //needle移动

                if (j != 0) {

                    N = j - next[j-1];

                    j = j - N;

                } else {

                    N = 1;

                    i++;

                }

            }

        }

        return -1;

    }

5. 另一个关键点就是算出字符串的next 数组。我们知道任何字符串的next[0]都是0;直接看代码,如果哪里不清楚,欢迎留言讨论。

public static int[] getNext(String needle) {

        int[] next = new int[needle.length()];

        int j = 0; // j 表示模式串中将要匹配的位置;

        next[0] = 0;

        int i = 1; // i 表示字符串 needle 的索引、也是next数组的索引,因为next[0] = 0( needle 的第一个字符的最大相等前后缀长度是0), 所以这里i从1开始;

        while (i < needle.length()) {

            if (needle.charAt(i) == needle.charAt(j)) {  // 相等时

                j++;

                next[i] = j;

                i++;

            } else if(j == 0) {  //不相等且j == 0时

                next[i] = j;

                i++;

            } else {  //不相等且j != 0时

                j = next[j - 1];

            }

        }

        return next;

    }

leetcode 028.实现strStr(),即查找重复字符串(KMP算法) 前言 本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt 算法、Boyer-Moore 算法、Sunday 算法等,本文 ## 前言 本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt 算法、Boyer-Moore 算法、Sunday 算法等,本文将讲解朴素解法(暴力匹配)和KMP算法 因为哈希方法可能出现哈希值相等但是字符串不相等的情况 阅读详情

相关推荐

KMP算法及相关例题整理(未完待续)

目录: 一、KMP算法 二、例题及代码编写指导 三、模板 一、KMP算法 在计算机科学中,KMP 算法(Knuth–Morris–Pratt string-searching algorithm)是用于搜索在一个字符串中某个字串的出现次数的算法,该算法考察:在失配发生时,应该在何处开始匹配下一个字符,以免于重新比较先前已经匹配的字符。 这个算法在 1970 年被 Donald Knuth 和 Va...

COFACTOR 1548

数据结构学习笔记——KMP算法中的常见计算题目总结

答:首先设next[1]=,next[2]=(要注意这里的数组是从1开始的,而不是0),如下表:当j=3时,k=next[j-1]=next[2]=1, 此时看S[j-1]=S[2]='b’与S[k]=S[1]='a’是否相等, 由于不相等,所以继续向前查找next值对应的字符来与前一位进行比较,由于通过查找至第一位仍未找到相等的字符,直接将其赋值,即next[i]=;当j=4时,k=next[j-1]=next[3]=1, 此时看S[j-1]=S[3]='a’与S[k]=S[1]='a’是否相等, 由于相

小宇y的博客 4323

KMP算法实战:解决LeetCode字符串匹配问题

本文旨在帮助读者深入理解KMP算法的工作原理,掌握其在字符串匹配问题中的应用。我们将覆盖从基础概念到实际编码实现的全过程,并通过LeetCode题目展示算法的实战价值。从暴力匹配法引入问题讲解KMP算法的核心思想详细解析部分匹配表提供Python代码实现解决LeetCode实际问题讨论算法性能和应用场景KMP算法:由Knuth、Morris和Pratt共同提出的字符串匹配算法,通过预处理模式串来优化匹配效率部分匹配表(Partial Match Table)

AI 算法实战派 1183

Leecode刷题——字符串——KMP算法

本文借助一道经典的字符串匹配的题目来复习KMP匹配算法。对于两个长度为n和m的字符串(文本串和模式串)的匹配,使用暴力解法的时间复杂度为O(m*n)而使用KMP算法的时间复杂度变为O(m+n)。 例题:28(实现 strStr()) 1.KMP概述 KMP算法的主要思想是在进行字符串的匹配出现不匹配的时候利用前面已经匹配过的一部分字符串来避免模式串的重头开始匹配。 文本串:用于进行被匹配的串(一般是长串) 模式串:用于匹配的串(一般是短串) 2.前缀表(next数组存储) 前缀表是记录

m0_67646485的博客 773

告别绕线!用Altium Designer从零设计一个PCB平面变压器(附3D模型)

本文详细介绍了如何使用Altium Designer从零设计一个PCB平面变压器,包括磁芯选型、电气参数计算、PCB设计实战技巧以及3D验证与生产输出。通过将绕组直接集成到PCB层中,配合嵌入式磁芯,实现了小型化、高功率密度的电源设计,适用于中低电流、高频应用场景。附3D模型,帮助读者快速掌握这一创新设计流程。

weixin_33716154的博客 442

InTouch历史报警与操作记录高效查询控件V4.0实战指南(一键下载即用)

本文详细介绍了InTouch历史报警与操作记录高效查询控件V4.0的实战应用。该控件针对原生AlmDbViewCtrl控件的查询效率低下、功能单一等问题,提供了智能查询、可视化统计、视图定制和一键导出Excel等强大功能,旨在帮助工程师快速处理海量历史数据,大幅提升工控运维效率。

g9h0i1的博客 960

代码随想录算法训练营第九天|LeetCode151.翻转字符串中的单词、KamaCoder55. 右旋字符串、LeetCode28.找出字符串中第一个匹配项的下标、LeetCode459.重复的子串

LeetCode151.翻转字符串中的单词文章链接:代码随想录视频链接:LeetCode:151.翻转字符串里的单词KamaCoder55. 右旋字符串文章链接:代码随想录LeetCode28.找出字符串中第一个匹配项的下标文章链接:代码随想录算法视频链接:KMP算法(理论篇)算法视频链接:求next数组(代码篇)LeetCode459.重复的子字符串文章链接:代码随想录视频链接:LeetCode:459.重复的子字符串最长前后缀匹配字符串就是一个字符串s的头部一部分子串和尾部一部分子串完全相同且。

python1_1的博客 1343

【ChatGPT实战案例】ChatGPT如何帮助产品经理高效工作?

1. 产品经理主要工作方向, 2. 具体工作中,向ChatGPT提问参考

weixin_62909516的博客 1900

Day9 字符串part02

KMP算法。

weixin_43545921的博客 124

GEE 案例:基于陆地卫星8号(大气层顶反射率数据)LANDSAT/LC08/C02/T1_TOA的生态遥感指数RSEI计算、可视化和下载

摘要:基于GEE的遥感生态指数(RSEI)计算方法 本文介绍了利用Google Earth Engine(GEE)平台计算遥感生态指数(RSEI)的全流程方法。主要内容包括:研究区域定义、Landsat8数据获取与去云预处理、关键生态指标计算(地表温度LST、植被指数NDVI、湿度指数WET和建筑指数NDBSI)、主成分分析(PCA)降维处理,以及结果可视化与数据导出。通过结合多源遥感指标并采用归一化处理,构建了综合反映区域生态环境质量的RSEI指数。该方法为生态环境监测提供了高效的技术方案,所有计算过程均

此星光明博客 457

大模型工作流Dify面试题及参考答案

设计一个基于 Dify 的智能摘要与重点提取 Agent,需结合Prompt 工程、模型能力配置和工作流优化,确保对长文本的高效解析和关键信息提炼。1. 明确任务需求与输入输出输入:长文本内容(如文章、报告、会议记录)或文本 URL输出摘要:简洁概括原文核心内容,控制在原文长度的 10%-20%重点列表:分点列出关键数据、结论、行动项等可选:关键词提取、情感倾向分析示例场景输入:一篇 5000 字的行业报告。

大模型大数据攻城狮的专栏 2517

kmp算法的使用和相关例题

KMP算法,也就是我们常说的“烤馍片”,是字符串类型题里面很重要的算法之一,主要用于字符串匹配。。学习KMP,一方面是为了利用这个算法做题,另一方面也是通过对kmp的运用来更加深入的理解字符串这个数据类型的本质。而KMP算法中的精髓就是,整个算法都是基于而存在的。

2401_89605914的博客 2220

一文学会python基础知识

1. python 运行环境 1.1 脚本式环境 1.2 交互式环境 2. python 注释 3. 变量及变量命名 4. 关键词 BIFS 5. 标准操作符 6. 条件判断 7. 循环 8. python 数据类型 9. python 序列 9.1 序列-字符串(str) 9.2 序列-列表 9.3 序列-元组 10. 字典 11. 集合 12. python内存管理及可变、不可变对象 13. 函数 13.1 函数参数 13.2 return and yiled(生成器) 13.3 参数传递处理 ...

weixin_43178406的博客 26万+

KMP算法(LeetCode 28题:实现strStr())

KMP模式匹配算法 KMP算法一般用于字符串匹配,即从文本串(text string)中找到与其匹配的模式串(pattern string)。 例如:文本串:a a b a a b a a f;模式串:a a b a a f。 解释:其文本串中出现了模式串,则称其字符串是匹配的。 LeetCode 28题:实现strStr() 实现 strStr() 函数。 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)

weixin_42051815的博客 311

学Simulink--基础微电网场景实例:基于Simulink的微电网黑启动过程建模与仿真

黑启动(Black Start)是指在全系统停电(无电压、无频率)状态下,微电网依靠内部电源自主恢复供电的能力。🌩️典型场景主网长时间故障自然灾害导致区域停电计划检修后重启❗挑战无参考电压/频率 → 逆变器无法锁相负荷逐级投入 → 需避免过流/过压多电源协调 → 防止环流或失步✅黑启动成功标准在30 秒内恢复关键负荷供电电压/频率稳定在范围内无设备损坏或保护跳闸🎯本文目标:手把手教你使用 Simulink + Simscape + Stateflow 搭建。

amy_mhd的博客 201

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【leetcode 力扣刷题】字符串匹配之经典的KMP!!!

一个字符串从第一个字符开始的,不包括最后一个字符的子串;

massive_jiang的博客 4555

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

面试怎么回答KMP算法相关问题

面试官问:你知道什么是KMP算法吗?说说你对KMP算法的理解。 答:KMP算法是用来进行字符串匹配查找的,核心先求出Next数组。**什么是next数组?**我的理解是: next数组表示的是待查找的字符串的最大公共前后缀中的公共前缀的最后一个字符的下标,知道这个下标,就可以知道当匹配目标字符串出错时,目标字符串的指针怎么回退,而查找段落的指针不用回退,这样遍历一遍查找段落,就可以知道是否存在目标...

龙之竹的博客 3267

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

KMP算法,力扣28题

KMP算法(力扣) 题目:28. 实现 strStr() 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = “hello”, needle = “ll” 输出: 2 示例 2: 输入: haystack = “aaaaa”, needle = “bba” 输出: -1 说明: 当 needle 是

l4kjih3gfe2dcba1的博客 1123

【每日算法】理论:深度学习基础 刷题:KMP算法思想

梯度消失是指在深度学习训练的过程中,梯度随着 BP 算法中的链式求导逐层传递逐层减小,最后趋近于0,导致对某些层的训练失效;梯度爆炸与梯度消失相反,梯度随着 BP 算法中的链式求导逐层传递逐层增大,最后趋于无穷,导致某些层无法收敛;

weixin_47748259的博客 1496

代码随想录算法训练营第九天|KMP算法、Leetcode28 实现 strStr()、Leetcode459 重复的子字符串

因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同。因为 这是相等的前缀和后缀,t[2] 与 k[2]相同 ,t[3]与k[3] 相同,所以,s[2]一定和s[4]相同,s[3]一定和s[5]相同,即:s[2]s[3] 与 s[4]s[5]相同。为什么要前一个字符的前缀表的数值呢,因为要找前面字符串的最长相同的前缀和后缀,所以要看前一位的 前缀表的数值。

Demok123的博客 1086

LeetCode刷题笔记(Day9)【KMP算法】

目录基础理论:KMP算法:模式匹配算法解决字符串匹配问题1.相关概念:2.KMP算法的本质:3.求前缀表:刷题笔记:1.28.实现strStr()力扣题目链接2.459.重复的子字符串力扣题目链接(1)前缀表:next数组,记录下标i之前(包括i)的模式串中,最大长度的公共前后缀。(2)前后缀:前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。(3)公共前后缀:前缀集合与后缀

weixin_46127108的博客 390

【算法】KMP 算法

KMP算法是一种改进的字符串匹配算法,通过构建前缀表避免不必要的回溯。前缀表记录了模式串每个子串的最长相同前后缀长度,用于在匹配失败时确定模式串指针的回退位置。以LeetCode 28题为例,算法先构建next数组,再通过双指针进行匹配。类似的459题利用前缀表性质判断字符串是否由重复子串构成,若最长前后缀长度与字符串长度之差能整除原长,则满足条件。KMP算法有效提高了字符串匹配效率,时间复杂度为O(n+m)。

2401_87853595的博客 1108

Leetcode 刷题笔记(八) —— 字符串篇之 KMP

Leetcode 刷题笔记(八) —— 字符串篇之 KMP算法的理解

a1241692733的博客 4004

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

这是一道经典的字符串匹配问题:考察基本的字符串操作考察算法优化思维考察对KMP算法的理解两种解法比较:暴力匹配:简单直观,适用于短字符串KMP算法:效率高,适用于长字符串优化思路:可以添加字符串预处理考虑使用其他字符串匹配算法注意特殊情况的处理。

qq_40263592的博客 1436

KMP算法

参考: https://leetcode-cn.com/problems/implement-strstr/solution/shua-chuan-lc-shuang-bai-po-su-jie-fa-km-tb86/ class Solution { public: int strStr(string haystack, string needle) { int n = haystack.size(), m = needle.size(); if (m == 0

weixin_45626706的博客 3632
上一篇: BigDecimal杂记
下一篇: 反转字符串(力扣344题\541题)
久安sweet
博客等级 码龄10年 5粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值