字符串经典算法KMP

LeetCode常见经典算法——KMP算法 常见经典算法 KMP算法 参考:https://www.bilibili.com/video/BV1jb411V78H?from=search&seid=6567338116212695926 关键字:有效回溯、最大公共前后缀长度、样本串的next数组(下一步回溯样本串的比较位置) 类库中String类的indexOf();方法采用的KMP算法,常规方法——依次暴力遍历,如果不匹配回溯到母字符串下一位置继续进行比较! 在这里存在一个问题,回溯到下一位置可能导致很多多余比较操作!例如下面示例: 母串: 阅读详情

KMP算法

解决寻找子串的问题。

public static int indexOf(String str1,String str2){
	...
}

步骤一:求next数组。

next数组的定义:
next[i]表示字符串下标i前面的子串中,最长公共前缀与后缀的长度。规定next[0]=-1,next[1]=0.
例如:str=“abcdabcf”,f的下标为7,next[7]表示子串"abcdabc"的最长公共前缀与后缀"abc"的长度3,next[7]=3.

next数组的求法:
数学归纳法:

  • 如果next[i]=k,str[k]=str[i],那么next[i+1]=k+1=next[i]+1;
abcdabcdf
012345678

例如:str=abcdabcdf。next[7]=len("abc")=3,而str[3]=str[7]='d',所以有next[8]=next[7]+1=4,if(str[7]=str[next[7]])。

  • 如果next[i]=k,str[k]!=str[i],那么该如何求next[i+1]呢?
abcdabcfg
012345678

例如:str=abcdabcfg. next[7]=len('abc')=3,str[7]≠str[3],该如何求next[8]。
就在以k结尾的前缀子串"abc"中寻找next,k=next[k],重复上面的比较步骤;

  • 如果k=-1,那么说明next[i+1]=k+1=0;(编程时,可以与第一种情况合并)
    例如:str=abcdabcef。next[7]=len(“abc”)=3,而str[3]!=str[7],所以在前缀子串’abc’中继续寻找next[k]=m,比较是否有str[m]=str[i],如果相等,next[i+1]=m+1;如果不相等,一直寻找下去,直到不存在更小的前缀子串,next[i+1]=0;
public static int[] getNextArray(String str){
        if(str == null || str.length() ==0)
            return null;
        if(str.length() == 1) {
            return new int[]{-1};
        }
        char[] array = str.toCharArray();
        int[] next = new int[array.length];
        next[0] = -1;
        int i = 1;
        int j = 0;
        while(i < array.length-1) {
            // 这里包含了两种情况,第一种是j=-1,,表示找不到公共前后缀了,next[i+1]=0
            // 第二种情况是,next[i]=k,str[k]=str[i],那么next[i+1]=k+1;
            if(j==-1 || array[i] == array[j]) {
                next[++i] = ++j;
            }
            else if(j >= 0) {
                j = next[j];
            }
        }
        return next;
    }

步骤二:字符串匹配

KMP算法的本质是利用next数组进行匹配加速。
例如:str1=xxxabcdabcgxxx,str2=abcdabcf
在这里插入图片描述
当i->g,j->f不匹配时,由于next[f]=len(abc)=3
所以j=next[j],匹配过程变成下面的样子:(相当于下面的子串向右平移)
在这里插入图片描述

public static int indexOf(String str1,String str2){
	int[] next = getNextArray(str2);
	int i=0;
	int j=0;
	char[] array1 = str1.toCharArray();
	char[] array2 = str2.toCharArray();
	while(i < array1.length && j < array2.length) {
		// j = -1,说明next[j]之前没有匹配上,next[0]=-1,这是i++,j=0;
		if(j == -1) {
			i++;
			j++;
		}
		// 匹配上了,i和j同时往后移
		else if(array1[i] == array2[j]) {
			i++;
			j++;
		} else {
			// 没有匹配上,将子串往右推
			j = next[j];
		} 
	}
	if(j == array2.length)
		return i - j;
	else return -1;
}

KMP算法的应用

  1. 两棵二叉树树,判断一棵树是否是另一棵树的子树。
    解法:将二叉树序列化(前序遍历)成唯一字符串,利用KMP算法判断字符串是否是子串。

  2. 一个字符串,在这个字符串末尾最少加上多少字符,可以使得新的字符串包含两个原始字符串。
    例如:abdgab,在字符串后面加上dgab,变成abdgabdgab,包含两个abdgab。
    解法:求next数组,利用next数组的含义求解。

数组字符串那些经典算法 面试用 这一部分的内容原本是打算在之后的字符串或者数组专题里面写的,但看着目前火热进行的各家互联网公司笔试面试中,出现了其中的一两个内容,就随即将这些经典问题整理整理,单写一篇发上来了。这里争取覆盖面广一些,列举了7个最经典的问题,也会是之后大家笔试面试常见到的问题,而每个问题下都列举了几种思路,掌握这些经典问题的解题思路和算法相信对同类型问题的解答都能有帮助。 立即下载

相关推荐

字符串常见的算法题经典

问题:反转字符串? 开始时想到的反转算法非常简单,就是利用折半法,把前后对应位置的字符互换。但该算法没有考虑速度和空间的优化。

总结:字符串经典算法

字符串的经典算法。

qq_43502142的博客 2128

qPCR定量方法在肠道微生物特定种属定量应用

大家都知道肠道中有上千种细菌,肠道微生物可参与人体代谢,促进营养物质的消化吸收,肠道微生态均衡关系到身体健康,肠道微生态失衡可能会导致疾病产生。此外有文献指出肠道微生物可能与人体免疫及炎性反应等有关。目前也越来越多人关注到疾病与肠道微生物的关系,也做了很多研究及实验,一般高通量结果得到的是每个物种在样本中的相对百分含量,而不同微生物的绝对含量其实也对疾病有很重要的影响。在此分享几篇有采用qPCR方法研究疾病与肠道微生物关系的文章。 早在2013年Kim-Anne Lê1、Yan Li等人发表文章Alter

tinygene的博客 2143

【基础算法总结】字符串

【基础算法总结】字符串

fight_p的博客 1522

修复zookeeper未授权访问漏洞

【代码】修复zookeeper未授权访问漏洞。

qq_28392947的博客 4067

【基于大模型 + FAISS 的本地知识库与智能 PPT 生成系统:从架构到实现】

本文介绍了一个基于大模型(Ollama+DeepSeek)和FAISS向量数据库的本地知识库与智能PPT生成系统。该系统采用前后端分离架构,包含文档管理、向量检索、PPT生成等核心模块,可实现文档智能解析、语义检索和结构化PPT自动生成。通过MVC设计模式,系统实现了从文档上传、向量存储到内容检索、PPT生成的全流程自动化,有效解决了企业知识管理效率低下的问题。架构设计清晰,功能模块完备,为企业和个人提供了高效的文档处理与二次创作解决方案。

聚焦大数据、AI、数据库三大核心领域,分享 Flink/Spark 实时计算、数仓架构设计、AI 模型落地、数据库性能调优的实战干货,附可直接运行的源码与方案。提供企业技术内训、项目咨询与定制化服务,助力开发者与企业高效搞定数智技术难题。 1599

字符串算法

字符串是由字符组成的有限序列,通常用于表示文本数据。字符串可以用不同的编码方式进行存储和处理,如ASCII和Unicode。

LS_Ai的博客 1199

RK3588 部署 YOLO26 目标检测:PT → ONNX → RKNN 全流程

YOLO26n 在 RK3588 上 INT8 量化后 NPU 推理约 15ms,系统 FPS 约 55,可以覆盖边缘端实时检测需求。模型从 PT 到 RKNN 的转换要用opset=11避免算子兼容问题。先用 YOLO26n + 640 输入跑通全链路,确认推理结果正确后再做性能调优。

m0_64661770的博客 303

算法学习(十)—— 字符串

这类题一般是和其它算法合起来,比如模拟,双指针,动态规划或者回溯等,所以字符串相关的题目类型一般是非常非常丰富的,这里我们选取几道经典的题目进行讲解。

aaqq800520的博客 932

微信小程序 - 实现身份证OCR识别人像面与国徽面并提取字段信息,详解从手机相册选取或打开摄像头拍照上传身份证正反面图片ocr文字识别数据填充表单(提供免费纯前端ocr识别插件+百度OCR识别API)

微信小程序身份证识别,微信小程序身份证拍照、上传并OCR识别,微信小程序实现OCR扫描识别,微信小程序识别身份证免费插件,微信小程序实现身份证识别功能。ocr识别插件。微信身份证拍照后进行ocr识别,微信小程序OCR扫描识别身份证,OCR身份证实名认证+图片上传+拍照上传图片,微信小程序之身份证照片正反上传,小程序OCR身份证识别,微信小程序实现文字识别-ocr插件,微信小程序利用百度AI实现扫描身份证获取信息功能,基于微信小程序OCR插件实现身份证拍照、上传并OCR识别的示例demo,将上传的照片传到服务

🏆 前端领域优质创作者 8133

【原理图PCB专题】Allegro模块化移动器件报...has the LOCKED property怎么解锁?

正常来说做好一个模块化,如果不需要再动,最好还是lock,防止不明白的工程师异动导致问题。如果复用布局设计时,因为有些器件和拓扑并不完全一致,那需要调整部分器件,被锁之后只能全选,无法修改。所以解开锁定后,就能正常编辑了。

一点硬件 2391

【算法系列】字符串

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)1.题目解析字符串中的单词以空格分割,求出字符串最后一个单词的长度2.算法分析直接调用string类的接口rfind, 从右向左找到第一个空格位置pos即可,用字符串总长度-pos-13.算法代码int main()string s;return 0;

C/C++技术栈 1842

Dify 第 2 篇 Dify 插件离线安装

Dify是一个支持插件扩展的AI平台,其插件市场提供5种类型插件(模型、工具、Agent策略、扩展、插件包)。由于默认pip安装速度慢,可通过dify-plugin-repackaging工具将插件转换为离线包(使用阿里云镜像加速)。该工具提供两种方式:1)自备Python环境执行脚本;2)使用Docker环境(推荐)。脚本支持从Dify市场或GitHub下载插件,并重新打包为含依赖的离线包,便于通过"本地插件"方式快速安装。

甘蓝的专栏 1261

经典算法梳理(4)KMP字符串匹配算法

KMP算法是经典的字符串匹配算法,比较难懂被人诟病。本文尝试深入浅出地描述KMP算法。字符串匹配,如图所示,在较长的字符串中,匹配找出,是否存在较短的的字符串。图示字符串匹配从第一个数字开始匹配。我们想想暴力算法如何匹配?第一个数字对齐,匹配7位,错误 ,移动到第二位继续之前的流程。。。很耗时间,能不能加速这个过程,就是KMP算法实现的KMP算法较为复杂的第一步:生成前缀数组 对于搜索词,我们...

美队庆编程类博客 419

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2976

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

经典算法 - 图解KMP算法与字符串匹配问题

字符串匹配问题 字符串匹配问题: 有一个字符串str1 = "BBC ABCDAB ABCDABCDABDE";和一个子串str2 = "ABCDABD"; 现在判断str1是否含有str2,存在返回匹配的第一次位置,不存在返回-1 暴力匹配法 思路 首先想到的就是暴力匹配法: 设计两个指针i,j,分别指向两个字符串,i向右移与str2[j]比较 一直比较到值相同的位置,i、j后移比较str1[i]与str2[j]的值 最终比较str1[10]与str2[6]不同,不匹配 再重新

key_768的博客 396

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

字符串模式匹配经典算法KMP算法及其Python代码实现

KMP算法个人理解和Python实现

weixin_59283901的博客 1461

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

20200922 001_经典算法面试题1——字符串匹配之KMP算法

20200922 001_经典算法面试题1——字符串匹配之KMP算法 转载:https://blog.youkuaiyun.com/v_july_v/article/details/7041827 1. 字符串匹配问题: 1)有一个字符串 str1= "BBC ABCDAB ABCDABCDABDE",和一个子串 str2="ABCDABD" 2)现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1 3)要求用最快的速度来完成匹配 4)你的思路是什么? .

qq_39696269的博客 3107

经典算法教程:KMP字符串匹配算法

在文本S中找到模板P所处的位置,称为字符串匹配。如图所示 最经典的算法莫过于由Knuth、Morris和Pratt三人设计的线性时间算法,简称KMP算法。 1.原理解释 如图,假设有文本S,模板P,在start位置开始匹配。当start=0时,表示从文本S的第一个字符开始匹配。 假设逐个匹配到模板P中第j+1个字符时,S与P中的字符不相等,表示S与P中的前j个字符都相等。当j=0时

cetrol_chen的博客 424

经典算法题09-字符串模式匹配KMP

一. 提问字符串模式匹配指的是,找出特定的字符串在一个较长的字符串中出现的位置。 有一个长字符串”ababcabababdc”,请问子串”babdc”出现的位置是哪里? 二. 思路在字符串模式匹配的学习中,可能首先就会想起将模式字符串和目标字符串逐个去比较,直到匹配为止,这就BF(Brute Force)算法(称为“朴素”算法或者暴力算法),这算法的确可行,但是不高效。BF(Brute Forc

狮子座明仔知识集散场 3514

KMP经典算法与变形的应用(字符串parttern匹配问题)

KMP经典算法与变形的应用(字符串parttern匹配问题) 1. 问题描述 求主串字符串a是否含有模式串字符串parttern b,也就是匹配问题经典KMP算法是计算next[j]数组,然后每次移动若干位而不是暴力求解的每次移动到partern的首位来比较。 暴力求解的算法很明显时间复杂度是O(m*n),而KMP(三个发明者的首字母)算法 的时间复杂度是O(m+n),为什么时间复杂度是O...

weixin_30602505的博客 515

KMP算法和字符串匹配

KMP算法是一个很经典的字符串匹配算法,以前只在算法课上写过作业,现在想起来,发现还是不会写了。所以再次温习记录一下。 字符串匹配 我们考虑如果不用KMP算法的话,暴力法做字符串匹配,简单写一下就是一个二重循环的写法,也就是,复杂度是相当高的。 int n_strStr(string str1, string str2) // 在str1 中匹配 str2 字符串 { int...

wx_14678的博客 260

Algorithm Gossip (11) KMP字符串匹配

跳转 字符串匹配: 跳转到我的博文 KMP算法 实现字符串匹配 http://blog.youkuaiyun.com/actanble/article/details/53024717 前言 This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用pyt...

weixin_30827565的博客 114

字符串匹配 KMP算法

问题描述:字符串匹配即查找待匹配字符串(模式串)p在主串s中的位置。一般处理这种问题往往采用简单粗暴的方法——暴力匹配法。所谓暴力匹配法,就是对主串s的每一个字符与要匹配的字符串p的每个字符进行逐一匹配。但暴力匹配效率比较低,经典算法KMP效率更高。 例:主串s=“abcdeabcdxabc”,模式串p=“abcdx”。结果应该返回5。 暴力匹配的图解如下: 代码如下: public clas...

覃会程的博客 1090

图解KMP算法

KMP算法是最常见的算法之一,通常用来解决字符串的匹配问题,KMP算法本人认为是比较难理解的,我对于这个算法的学习是通过边画图边理清思路,然后在理解的基础上再进行代码的编写,我认为这个方法对于我来说能够更好的掌握这个算法,因此通过这篇博客进行分享,希望能对大家有所帮助! KMP算法的介绍 KMP算法是一个解决模式串在文本串是否出现过,如果出现过,求出最早出现的位置的经典算法;KMP算法是在暴力匹配...

can_chen的博客 1272

『字符串模式匹配 KMP』

字符串模式匹配 我们要先了解一下问题是什么。 模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。 KMP 然后我们来认识一下今天的主角\(KMP\)。 \(KMP\)算法是一种用来解决字符串模式匹配问题的一个经典算法,其能够在线性时间内求出在一个字符串中是否出现了另一个指定字符串,以及出现的位置,出现的次数。 形...

weixin_33724570的博客 179
上一篇: Http2.0与Http1.x的区别
下一篇: 常用的linux命令
classify233
博客等级 码龄10年 3粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值