【笔试题心得】关于KMP在笔试中的题型

news2025/1/11 6:00:54

好几家都考到KMP了 问的比较多的是 next数组 , 其实KMP的相关机制我在代码随想录算法训练营第九天|KMP算法_菜鸟的Zoom之旅的博客-CSDN博客中写道过,现在在复习一下,由于next数组的定义其实会有所歧义(有些程序中会直接将前缀表作为next),故这里写明个个环节中next数组的值。

这里对KMP进行一个回顾
(摘抄自KMP算法解析_caccbacbb 使用kmp算法next_秋之颂的博客-CSDN博客)

1) 首先回顾一下前缀和后缀的概念:

对于一个字符串,其前缀是指其所有头部子串(包括本身)构成的集合,而“真前缀”就是不包括其本身的所有头部子串构成的集合,可以参考子集和真子集的比较。
同样,后缀是指其所有尾部子串(包括本身)构成的集合,而“真后缀”就是不包括其本身的所有尾部子串构成的集合,注意,不论前缀还是后缀,其字符排列顺序都是从左至右,与原串相同,下面举例说明:

对于串“abacab”,
其前缀是{a, ab, aba, abac, abaca, abacab},真前缀是{a, ab, aba, abac, abaca};其后缀是{abacab, bacab, acab, cab, ab, b},真后缀是{bacab, acab, cab, ab, b}.

(2) 接下来,回顾一下最长相等真前后缀长度的概念:

最长相等真前后缀长度即某串真前缀与真后缀做交集后,集合中最长的串的长度,

以串“ababa”为例:
对于串“ababa”,其真前缀{a, ab, aba, abab}与真后缀{baba, aba, ba, a}的交集为{a, aba},其中“aba”最长,为3,因此串“ababa”的最长相等真前后缀长度为3

(3) KMP算法流程

这里先不具体解释第“(1)、(2)”步到底在干什么,因为很难理解,等按照以下步骤,再加上后面的实例走一遍,就差不多可以理解了。

i. 计算模式串的所有前缀的最长相等真前后缀长度;
ii. “i.”中所有长度构成部分匹配值(PM)数组(其实也就是前缀表),每一个值对应一个字符;
iii. 部分匹配值按位右移,左边用-1补齐,再统一加1,得到Next数组;
iv. 在匹配过程中,如果在模式串的某个字符出现失配,以该字符对应的Next值跳到模式串相应位置,再与主串当前位置进行比较;
iv. 重复以上过程直至完全匹配成功或者匹配失败,结束程序。

标红的部分清晰的说明了Next数组的求解方式。

下面举一个例子:

 大厂笔试真题(xhs)

xhs:

已知串s=bccabcaac,采用KMP算法进行模式匹配,则得到的nex数组值为()

A:011211111
B:011112311
C:011121132
D:021221121

答案:B 

首先PM为:000012000
PM右移:   -100001200
Next:011112311

mhy:

设主串T=”abcababcabc”,模式串S=”abcabc”,采用KMP算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是()

A:15

B:16

C:14

D:13

步骤

abcababcabc
abcabc

第一次模式匹配时可以看到在匹配到c处时匹配出错,所以第一次匹配各字符的比较次数是6次。(注意而不是5,因为c比较了之后才知道与a不匹配。)

abcababcabc
abcabc

蓝色是上次匹配错误的地方,这次又进行了1次字符比较就发现不匹配,后面的就不用匹配了

abcababcabc
abcabc

这次又匹配了6次

所以总共是6+1+6=13次 

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

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

相关文章

C++专题--标准模板库STL

c专题-标准模板库STL 1 标准模板库概述 2 序列式容器 2.1 vector 容器 2.2 deque 容器 2.3 list 容器 3 关联式容器 4 无序关联容器 5 容器适配器 5.1 STL容器适配器的种类 5.2 stack容器适配器 5.3 queue容器适配器 5.3 priority_queue容器适配器…

Mac RN环境搭建

RN ios android原生环境搭建有时候是真恶心,电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限,执行失败。因为Mac…

SQL Server2019安装后使用SQL Server身份验证登录失败

错误情况 今天在电脑安装SQL Server2019和SMMS,安装过程一切顺利,但是在使用SMMS连接数据库时出现了异常。使用"Window 身份验证"登录时正常,但是如果改为使用"SQL Server 身份验证"登录时却连接失败! 解决方…

两张图搞定前端面试特别常重要的知识点:defer和async的区别

渲染引擎解析<script>的过程 <script>标签上有defer或async属性&#xff0c;脚本就会异步加载。渲染引擎遇到这一行命令&#xff0c;就会开始下载外部脚本&#xff0c;但不会等它下载和执行&#xff0c;而是直接执行后面的命令&#xff1b;默认情况是渲染引擎遇到…

微信开发之一键扫码入群的技术实现

好友将群二维码发送给机器人&#xff0c;机器人调用本接口将自动识别入群 请求URL&#xff1a; http://域名地址/scanJoinRoom 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 …

MS2692宽带低噪声放大器

MS2692 是一款宽带低噪声放大器&#xff0c;工作频率 0.45GHz  5.0GHz 。 具有高线性度、低噪声、带内增益平坦等特点。在 0.85GHz  4.0GHz 频带内&#xff0c;增益波动小于 3dB 。在 0.85GHz  5.0GHz 频带内&#xff0c;噪声系数 小于 1.2dB 。内部集成偏…

文件批量改名高手:轻松删除文件名,仅保留编号!

您是否经常需要对大量文件进行命名调整&#xff1f;是否为繁琐的手动操作而感到厌烦&#xff1f;现在&#xff0c;我们的智能批量文件改名工具为您提供了一种简单而高效的解决方案&#xff01;只需几步操作&#xff0c;您就能轻松删除原有的文件名&#xff0c;仅保留编号&#…

Oracle-如何判断字符串包含中文字符串(汉字),删除中文内容及保留中文内容

今天遇见一个问题需要将字段中包含中文字符串的筛选出来 --建表 CREATE TABLE HADOOP1.AAA ( ID VARCHAR2(255) ); --添加字段INSERT INTO HADOOP1.AAA(ID)VALUES(理解);....--查询表内容SELECT * FROM HADOOP1.AAA;在网上查找了一下有以下三种方式&#xff1a; 第一种&#…

新的 Python URL 解析漏洞可能导致命令执行攻击

Python URL 解析函数中的一个高严重性安全漏洞已被披露&#xff0c;该漏洞可绕过 blocklist 实现的域或协议过滤方法&#xff0c;导致任意文件读取和命令执行。 CERT 协调中心&#xff08;CERT/CC&#xff09;在周五的一份公告中说&#xff1a;当整个 URL 都以空白字符开头时&…

智慧建筑工地平台,通过信息化技术、物联网、人工智能技术,实现对施工全过程的实时监控、数据分析、智能管理和优化调控

智慧工地是指通过信息化技术、物联网、人工智能技术等手段&#xff0c;对建筑工地进行数字化、智能化、网络化升级&#xff0c;实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量&#xff0c;降低施工成本&#xf…

BBS-个人博客项目完整搭建、BBS多人博客项目基本功能和需求、项目程序设计、BBS数据库表结构设计、创建BBS表模型

一、BBS-个人博客项目完整搭建 项目开发流程 一、项目分类 现在互联网公司需要开发的主流web项目一般分为两类&#xff1a;面向互联网用户&#xff0c;和公司内部管理。面向互联网用户: C(consumer)端项目 公司内部管理&#xff1a;B(business)端项目还有一类web应用&#xff…

jeecg-boot批量导入问题注意事项

现象&#xff1a; 由于批量导入数据速度很快&#xff0c; 因为数据库中的create time字段的时间可能一样&#xff0c;并且jeecg框架自带的是根据生成时间排序&#xff0c; 因此在前端翻页查询的时候&#xff0c;数据每次排序可能会不一样&#xff0c; 会出现第一页已经出现过一…

Qt读写Excel--QXlsx编译为静态库2

1、概述&#x1f954; 在使用QXlsx时由于源码文件比较多&#xff0c;如果直接加载进项目里面&#xff0c;会增加每次编译的时间&#xff1b; 直接将源码加载进项目工程中&#xff0c;会导致项目文件非常多&#xff0c;结构变得更加臃肿&#xff1b; 所以在本文中将会将QXlsx编译…

三维可视化平台有哪些?Sovit3D可视化平台怎么样?

随着社会经济的发展和数字技术的进步&#xff0c;互联网行业发展迅速。为了适应新时代社会发展的需要&#xff0c;大数据在这个社会经济发展过程中随着技术的进步而显得尤为重要。同时&#xff0c;大数据技术的快速发展进程也推动了可视化技术的飞速发展&#xff0c;国内外各类…

vue中封装自动计算比例滑块

此插件为另一位漂亮的前端同事小姐姐封装,觉得非常好用于是决定记载下来,便于复用 如图需要动态传入需要分配权重的数组,平均分配可以自动将100%平均分给数组中的值 如果手动拖拽,则会自动计算可拖动最大区域,便于最终总权重必定为100% <el-alert class"merge-alert&…

【深度学习 | 梯度那些事】 梯度爆炸或消失导致的模型收敛困难?挑战与解决方案一览, 确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

minio 分布式文件系统主从复制

1. 在slave节点下载mc客户端工具 下载 2. 移动或复制mc文件到/usr/local/bin/文件夹 mv mc /usr/local/bin 3. 赋值权限给 mc 文件 chmod x mc 4. 查看mc客户端版本,看是否可用 #控制台显示返回信息用下面这条 mc --version #控制台显示无返回信息用下面这条 mc --versi…

LeetCode ACM模式——二叉树篇(一)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 定义二叉树 创建二叉树 利用前序遍历创建二叉树 利用数组创建二叉树 打印二叉树 144. 二叉树的前序遍历 递归遍历 迭代遍历&#xff08;利用栈&#xff09; 145. 二…

移动端预览指定链接的pdf文件流

场景 直接展示外部系统返回的获取文件流时出现了跨域问题&#xff1a; 解决办法 1. 外部系统返回的请求头中调整&#xff08;但是其他系统不会给你改的&#xff09; 2. 我们系统后台获取文件流并转为新的文件流提供给前端 /** 获取传入url文件流 */ GetMapping("/get…

43 | 抖音大V人民日报粉丝数分析

背景介绍 抖音是一个面向全年龄的音乐短视频社区平台,如今已成为最火的短视频软件,无数短视频创作者通过抖音分享生活,分享技能,分享美好。其中有点赞、评论、转发、关注等功能。 我们试图分析“大 V”即粉丝数量相对较多的博主的涨粉数量和点赞、评论、转发之间的关系,…