KMP算法【C++】

KMP算法测试

KMP 算法详解

根据解释写出对应的C++代码进行测试,也可以再整理成一个函数


#include <iostream>
#include <vector>class KMP
{
private:std::string m_pat;//被匹配的字符串std::vector<std::vector<int>> m_dp;//状态二维数组public:void create_dp(std::string pat){int M = pat.length();//dp[状态][下一字符] = 下一状态std::vector < std::vector<int> > dp(M, std::vector<int>(256, 0));//初始化全部为0//base case 遇到第一个匹配的字符就转到状态1dp[0][pat.at(0)] = 1;//影子状态X初始在0状态int X = 0;//构建状态转移图,确定每一个状态遇到任何字符后状态的转变for (int i = 1; i < M; i++){//每一个状态遇到任何字符的处理,字符的大小不超过256for (int j = 0; j < 256; j++){//先把当前状态遇到所有字符后的状态,与影子的状态一致dp[i][j] = dp[X][j];}//遇到正确的字符,再单独调整,直接跳转下一状态dp[i][pat.at(i)] = i + 1;//更新影子的位置,遇到一样的字符后,才会更新X = dp[X][pat.at(i)];}this->m_dp = dp;//保存为私有this->m_pat = pat;//保存为私有}//在txt里面搜索pat,成功了返回匹配的索引int search(std::string txt){int M = this->m_pat.length();int N = txt.length();//pat 的初始状态为0,表示还没有一个处理成功int j = 0;for (int i = 0; i < N - M; i++){//计算pat的下一状态j = this->m_dp[j][txt.at(i)];//到达终点的状态,全部匹配成功if (j == M)return i - M + 1;}//没有到达终点状态,匹配失败return -1;}
};int main()
{KMP kmp;kmp.create_dp("aaaabaaa");//创建需要被匹配的字符串int res = kmp.search("aaaabaabaaaabaaa");//开始在指定的字符串里面搜索if (res < 0)printf("未能匹配!\n");printf("匹配成功,索引为:%d", res);return 0;
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b10739ef20074efebb2e3e8eb112b0f2.png

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

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

相关文章

怎样解决Redis高并发竞争Key难点?

Redis作为一种高性能的键值存储系统&#xff0c;在现代分布式系统中发挥着重要作用。然而&#xff0c;高并发场景下对同一Key的操作可能引发竞争条件&#xff0c;给系统稳定性和数据一致性带来挑战。本文将探讨如何解决这一问题&#xff0c;为读者提供有效的应对策略。 1. Red…

【002】FlexBison实现原理

0. 前言 Flex和Bison是用于构建处理结构化输入的程序的工具。它们最初是用于构建编译器的工具&#xff0c;但它们已被证明在许多其他领域都很有用。 &#xfeff; 在第一章中&#xff0c;我们将首先看一点(但不是太多)它们背后的理论&#xff0c;然后我们将深入研究一些使用它…

Mysql和Postgresql创建用户和授权命令

Mysql和Postgresql创建用户和授权命令 MySQL/MariaDB/TiDB mysql -uroot -P3306 -p 输入密码&#xff1a;xxx create user user1% identified by xxx; grant all privileges on *.* to user1%; create user user2% identified by xxx; grant all privileges on *.* to user2%;…

Winform /C# 截图当前窗体,指定区域,当前屏幕

1.当前窗体 public static Image CaptureControl(Control ctrl){System.Drawing.Bitmap bmp new System.Drawing.Bitmap(ctrl.Width, ctrl.Height);ctrl.DrawToBitmap(bmp, new Rectangle(0, 0, ctrl.Width, ctrl.Height));return bmp;}private void DownLoad(){string filePa…

java类中运行main方法时报错:找不到或无法加载主类 XXX

运行main类报了这个错 错误: 找不到或无法加载主类 XXX 经过好一番查证才找出了问题所在 原因是 maven项目的provided导致的&#xff0c;现在记录一下。 将pom.xml中标注provided的注释掉&#xff0c;就不报错了。

ERROR [internal] load metadata for docker.io/library/node:20-alpine

docker编译时报错&#xff0c;除标题外&#xff0c;还报如下信息 ERROR: failed to solve: node:20-alpine: failed to resolve source metadata for docker.io/library/node:20-alpine: failed to do request: Head "https://registry-1.docker.io/v2/library/node/mani…

常用个人信息

目录 常用联系方式我的自动思维常用媒体专业相关康米相关黑历史 常用联系方式 QQ&#xff1a;2868679921 微信&#xff1a;Commieee 邮箱&#xff1a;sharvefoxmail.com 我的自动思维 常用媒体 哔哩哔哩 专业相关 博客 康米相关 QQ&#xff1a;1203361015 黑历史 贴吧…

PyQt5学习系列之QMetaObject.connectSlotsByName

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 学习记录 QMetaObject.connectSlotsByName——自动将信号连接到槽&#xff08;函数&#xff09; 例如&#xff1a; from PyQt5.QtWidgets import QMainWindow, QPushButton from PyQt5.QtCore…

哪些类型的产品适合用3D形式展示?

随着3D技术的蓬勃发展&#xff0c;众多品牌和企业纷纷投身3D数字化浪潮&#xff0c;将产品打造成逼真的3D模型进行展示&#xff0c;消费者可以更加直观地了解产品的特点和优势&#xff0c;从而做出更明智的购买决策。 哪些产品适合3D交互展示&#xff1f; 产品3D交互展示具有直…

2024系统架构师--- 希赛模拟答案知识点

案例第一题&#xff1a; MVC架构包含&#xff1a;视图、控制器、模型&#xff1b; 视图&#xff08;View&#xff09;&#xff1a;视图是用户看到并与之交互的界面。视图面向用户显示相关的数据&#xff0c;并能接收用户的输入数据&#xff0c;但是它并不能进行任何实际的业务…

深入探索微软Edge:领略新一代浏览器的无限可能

深入探索微软Edge&#xff1a;领略新一代浏览器的无限可能 在当今数字化时代&#xff0c;网络浏览器已经成为我们日常生活中不可或缺的一部分。而随着技术的不断进步&#xff0c;浏览器的功能和性能也在不断提升。微软Edge作为微软推出的全新一代浏览器&#xff0c;引领着浏览…

自己手写一个字符串【C风格】

//字符串的常见操作 #include <iostream>#define MAX_SIZE 15 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status;//状态类型 typedef char ElemType;//元素类型typedef ElemType String[MAX_SIZE 1];//第一个字节记录长度//***tring是数…

c#自动生成缺陷图像-添加新功能(可从xml直接提取目标数据,然后进行数据离线增强)--20240524

在进行深度学习时,数据集十分重要,尤其是负样本数据。 故设计该软件进行深度学习数据预处理,最大可能性获取较多的模拟工业现场负样本数据集。 该软件基于VS2015、.NETFrameWork4.7.2、OpenCvSharp1.0.0.0、netstandard2.0.0.0、SunnyUI3.2.9.0、SunnyUI.Common3.2.9.0及Ope…

C盘磁盘空间不够用,怎样将d盘的空间划分给c盘?

C盘磁盘空间不够用&#xff0c;怎样将d盘的空间划分给c盘&#xff1f; 背景&#xff1a;win10系统下。C盘原有50G&#xff0c;如今只剩下8G&#xff0c;已经捉襟见肘了&#xff0c;想从D盘&#xff0c;割100G给C盘&#xff0c;以后软件能直接装C盘了。操作步骤如下&#xff1a…

2024年人文艺术与创新教育国际学术会议(ICHAIE 2024)

2024年人文艺术与创新教育国际学术会议&#xff08;ICHAIE 2024) 2024 International Conference on Humanities, Arts and Innovation Education 一、【会议简介】 随着全球化的推进和科技的迅猛发展&#xff0c;人文艺术与创新教育在培养未来人才方面扮演着越来越重要的角色…

温故而知新-导航【面试复习】

温故而知新-导航【面试复习】 前言版权温故而知新-导航【面试复习】最后 前言 2024-5-18 00:01:31 以下内容源自《【温故而知新】【面试复习】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss…

【深度学习】ONNX介绍

ONNX&#xff08;Open Neural Network Exchange&#xff09; ONNX 是一种用于表示深度学习模型的开放格式&#xff0c;使得不同深度学习框架&#xff08;如 PyTorch、TensorFlow、Caffe2 等&#xff09;之间的模型能够相互交换。 需安装&#xff1a; pip install --upgrade o…

docker 版 mysql 主从同步

docker 版 mysql 主从同步 1、环境2、搭建主服务器实例33062.1、命令2.3、进入/mydata/mysql-master/conf 目录下新建 my.cnf2.4、修改完配置后重启 master 实例2.5、进入 mysql-master 容器2.6、master 容器实例内创建数据同步用户3、新建从服务实例 33083.1、命令3.2、进入/m…

springboot185基于vue.js的客户关系管理系统(crm)的设计与实现-手把手调试搭建

springboot185基于vue.js的客户关系管理系统(crm)的设计与实现-手把手调试搭建 springboot185基于vue.js的客户关系管理系统(crm)的设计与实现-手把手调试搭建

springboot事务结合分布式锁超卖问题

背景 商品销售扣减库存是常见的场景&#xff0c;考虑性能的可以使用redis存储库存进行扣减&#xff0c;并发小的也可以采用数据量库存占用记录实时计算方式&#xff0c;最近开发的功能由于并发量不大&#xff0c;考虑到实现简洁的因素&#xff0c;决定采用库存占用记录实时计算…