当前位置: 首页 > news >正文

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

相关文章:

  • 【MySQL精通之路】InnoDB(6)-磁盘结构(6)-Undolog
  • 【C语言】程序员自我修养之文件操作
  • 初始化是什么
  • 技术人内卷下新的尝试
  • Windows下安装Hadoop(引导版)
  • python-鸡兔同笼问题:已知鸡和兔的总头数与总脚数。求笼中鸡和兔各几只?
  • CSP模板生成系统
  • 三维科技云展厅如何突破传统展览的局限,赋能企业高效展示
  • linux常用命令之大数据平台搭建版
  • [CocosCreator]Android的增加AndroidX的动态权限
  • 【JavaScript寻宝之旅】var和let的区别
  • 图书管理系统(Java版本)
  • 如何进行前端职业规划
  • 小红书-社区搜索部 (NLP、CV算法实习生) 一面面经
  • 宝藏网站推荐-封面图片生成器
  • 时间复杂度分析经典问题——最大子序列和
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【个人向】《HTTP图解》阅后小结
  • Angular 2 DI - IoC DI - 1
  • Apache Pulsar 2.1 重磅发布
  • Apache的80端口被占用以及访问时报错403
  • CSS3 变换
  • ECMAScript入门(七)--Module语法
  • IndexedDB
  • java正则表式的使用
  • JS函数式编程 数组部分风格 ES6版
  • maya建模与骨骼动画快速实现人工鱼
  • npx命令介绍
  • React中的“虫洞”——Context
  • ucore操作系统实验笔记 - 重新理解中断
  • 聚类分析——Kmeans
  • 看域名解析域名安全对SEO的影响
  • 码农张的Bug人生 - 见面之礼
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 深度学习入门:10门免费线上课程推荐
  • 微服务框架lagom
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 译自由幺半群
  • FaaS 的简单实践
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Python) SOAP Web Service (HTTP POST)
  • (Qt) 默认QtWidget应用包含什么?
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)Sql Server 保留几位小数的两种做法
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net MVC + EF搭建学生管理系统
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)