C++的KMP算法

        Knuth-Morris-Pratt (KMP) 算法是一种改进的字符串匹配算法,用于解决在一个主字符串(也称为文本串)中查找一个模式串的位置的问题。相比于朴素的字符串匹配算法,KMP 算法通过利用已匹配部分的信息,避免了在每次匹配失败时都从头开始比较的缺点,从而大大提高了匹配的效率。

        KMP算法的核心思想是利用已经部分匹配这个有效信息,当字符串匹配过程中出现字符不匹配时,能知道一部分已经匹配的信息,利用这些信息避免从头开始匹配,从而提高算法效率。

        具体来说,KMP算法中定义了一个叫做“部分匹配表”(也称为“失效函数”或“跳转表”)的数据结构,用于存储模式串中各个子串的最长相同前后缀长度。当在文本串中匹配到某个位置时,如果发生不匹配,则根据部分匹配表确定模式串应该回退到的位置,继续匹配。

        构建部分匹配表是KMP算法的关键步骤。对于模式串 `P`,其部分匹配表 `lps` 的构建算法如下:

        1. `lps[0]` 始终为 0,因为空字符串没有前后缀。
        2. 初始化 `len = 0`,用于记录当前最长前后缀的长度。
        3. 遍历模式串的每个字符 `P[i]`,其中 `i` 从 1 开始:
           - 当 `P[i]` 等于 `P[len]` 时,`len` 增加,意味着最长前后缀长度可以扩展。
           - 当 `P[i]` 不等于 `P[len]` 时,如果 `len` 不为 0,则 `len` 更新为 `lps[len-1]`,表示根据上一个位置的部分匹配信息回退;否则 `len` 保持为 0。
           - 在每个位置,更新 `lps[i]` 为当前的 `len` 值。

        以下是一个C++实现的KMP算法示例,代码如下。

#include <iostream>
#include <vector>
#include <string>using namespace std;// 计算部分匹配表
vector<int> computeLPSArray(const string& pat, int M) {vector<int> lps(M, 0);int len = 0; // length of the previous longest prefix suffixint i = 1;lps[0] = 0; // lps[0] is always 0// the loop calculates lps[i] for i = 1 to M-1while (i < 

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

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

相关文章

C/C++开发,,pthreads-win32官网,pthreads-win32

pthreads-win32官网地址&#xff1a; POSIX Threads (pthreads) for Win32

为什么 google analysis 的 Custom Dimensions 设置后 Explorations 中不显示选项

可能有以下几种原因&#xff1a; 未完成配置或发布&#xff1a; 确保自定义维度已经完全设置&#xff0c;并且配置已经发布。未发布的设置不会生效。 数据处理延迟&#xff1a; 自定义维度设置后&#xff0c;数据处理可能需要一些时间。通常需要24到48小时才能在报告和探索中看…

使用LabVIEW进行大数据数组操作的优化方法

针对大数据量数组操作&#xff0c;传统的内存处理方法可能导致内存不足。通过LabVIEW的图像批处理技术&#xff0c;可以有效地进行大数据数组操作&#xff0c;包括分块处理、并行处理和内存优化等。这种方法能显著提高处理效率和系统稳定性。 图像批处理的优势 内存优化&#…

vs2017中C2440错误:“初始化”:无法从const char[6]转换为char*问题解决

本文摘要&#xff1a;本文已解决 Python FileNotFoundError 的相关报错问题&#xff0c;并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领…

Mamba v2诞生:2 那些烧脑的矩阵们

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

眼在手上的手眼标定(matlab+python)实测精度±1mm

眼在手上的手眼标定&#xff08;matlabpython&#xff09;实测精度1mm 原理网上有很多教程&#xff0c;提供一个参考&#xff0c;就不详细阐述了&#xff0c;这里主要记录一下手眼标定的过程和代码。源码&#xff1a;https://gitee.com/Tavox/hand-eye-calibrate 一、准备工作…

【Unity Shader入门精要 第13章】使用深度和法线纹理(二)

1. 再谈运动模糊 之前的文章中曾经通过保存渲染结果进行叠加的方式实现过运动模糊效果&#xff0c;下面的例子我们通过深度纹理重建世界坐标的方式来实现运动模糊&#xff1a; 首先&#xff0c;基于深度纹理重建像素的世界坐标&#xff0c;原理在【Unity Shader入门精要 第13…

Elasticsearch 认证模拟题 - 9

一、题目 在集群上有两个索引 index_a 和 index_b&#xff0c;index_a 中有字段 field_a&#xff0c;没有 field_a_desc&#xff1b;index_b 中有 field_a、field_a_desc。其中 index_b 中共有 10 条数据。 要求&#xff1a; reindex 一个索引 index_c&#xff0c;要求包含 …

OpenMMLab 2.0系列课程汇总(15篇)

(01)OpenMMLab 2.0 整体介绍(02)MMEngine & MMCV 介绍(03)MMClassification 介绍(04)MMSelfsup 介绍(05)MMDetection 介绍(06)MMDetection3D 介绍(07)OpenMMLab 社区荣誉体系介绍(08)MMSegmentation 介绍(09)MMAction2 介绍(10)MMPose 介绍(11)MMEditing & MMGeneratio…

Java返回前端Bigdecimal类型数据时“0E-8“及小数点多余0的问题

目录 问题描述: 解决方法: 重要代码&#xff1a; 问题描述: 项目中oracle数据库需要转换为mysql&#xff0c;Oracle中的表字段定义为number(36,16)类型的工具自动转换为mysql的decimal(36,16)。在Oracle数据库中&#xff0c;number(36,16)类型的字段&#xff0c;使用BigDeci…

LAMPSECURITY: CTF4 靶机实战

信息收集&#xff1a; 存活扫描&#xff1a; 端口扫描&#xff1a; 服务扫描&#xff1a; web页面&#xff1a; blog页面发现注入点&#xff1a; sql注入&#xff1a; sqlmap一把梭&#xff1a; 多个参数记得打&#xff1a; 哦 ssh登录&#xff1a; 老版本的ssh&#xff0c;…

Redis高频面试基本问题整理

文章目录 1、Redis底层协议2、Redis的热Key问题如何解决3、Redis是单线程还是多线程4、 什么是脑裂问题&#xff1f;5、redis集群会有写操作丢失吗&#xff1f;6、什么是 Redis 的 Pipeline&#xff1f;它有哪些优点&#xff1f;7、redis主从复制、哨兵机制、集群的理解8、缓存…

浏览器中的disable cache对文件下载服务的影响

客户端缓存文件 对于HTTP的文件请求来说&#xff0c;为了保证请求的速度&#xff0c;会使用客户端缓存的机制。比如客户端向服务器端请求一个文件A.txt。服务器在接收到该请求之后会将A.txt文件发送给客户端。 其请求流程如下&#xff1a; 步骤1&#xff1a;客户端请求服务器…

告别鼠标:蓝牙无线安卓模拟鼠标,绘图板,手写板操作电脑PC端,卡卡罗特也说好,儿童节快乐

家人们&#xff0c;上链接了&#xff1a;https://download.csdn.net/download/jasonhongcn/89387887 横屏模式&#xff1a; 竖屏模式&#xff1a; 操作说明&#xff1a; 1. 手势滑动模拟鼠标移动 2. 界面如果有滚动条&#xff0c;右手指按紧&#xff0c;通过左手指移动实现…

2024年自然语言处理科学与信息检索技术国际会议(ICNLPSIRT 2024)

2024年自然语言处理科学与信息检索技术国际会议(ICNLPSIRT 2024) 2024 International Conference on Natural Language Processing Science and Information Retrieval Technology (ICNLPSIRT 2024) 会议地点&#xff1a;武汉&#xff0c;中国 网址&#xff1a;http://www.i…

使用el-tree封装一个权限管理的小功能

使用el-tree封装一个权限管理的小功能 使用el-tree封装权限管理, 选中人员并且在右侧回显, 此组件用到了递归, 我只是将需要显示的数据进行了动态传递, 其他数据小伙伴可以自己封装 父组件 <template><div><authorityManage ref"authorityManage" :…

STM32单片机国产替代系列

目录 兆易创新GD32系列 华大半导体HDSC HC32系列 英锐恩ENROO系列 灵动微电子MindMotion系列 华芯微特系列 PY32F030单片机 NG32xx系列单片机 兆易创新GD32系列 应用领域&#xff1a; 工业自动化&#xff1a;用于工厂自动化、过程控制和监测等系统&#xff0c;提供精确…

python - DataFrame查询数据操作

学习目标 掌握获取df一列或多列数据的方法 知道loc和iloc的区别以及使用方法 知道df的query函数的使用方法 知道isin函数的作用和使用方法 获取DataFrame子集的基本方法 1.1 从前从后获取多行数据 案例中用到的数据集在文章顶部 LJdata.csv 前景回顾 head() & tail(…

实现树形结构几种方式

1&#xff0c;三级分类树形结构查询 /*** DDD(Domain-Driven Design): 领域驱动设计** 三级分类树形结构&#xff1b;* 支持无限层级&#xff1b;* 当前项目只有三级*/ Data public class CategoryTreeTo {private Long categoryId; //1private String categoryName;private …

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programming xv6 in C)

系列文章目录 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&#xff09;----课程实验环境搭建&#x…