//KMP算法
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>using namespace std;//next数组值的推导void getNext(string &str, vector<int>& next){int strlong = str.size();//next数组的0位为0next[0]=0;//i为当前字符的位置,从1位(第2个开始)int i=1;//length为当前字符之前的最长匹配子串的长度int length=0;while(i<strlong){if(str[i]==str[length]){//cout<<"当前字符匹配"<<str[i]<<"和"<<str[length]<<endl;length++;next[i]=length;i++;}else{/*如果length为0,说明当前字符之前没有匹配的子串,next数组值为0,i进一位*/if(length==0){//cout<<"当前字符之前没有匹配的子串"<<endl;next[i]=0;i++;}/*如果length不为0,说明当前字符之前有匹配的子串,通过即查看上一个位置的最长匹配长度,继续尝试匹配*/else{//cout<<"当前字符之前有匹配的子串"<<endl;//查找这个字串之前得最长公共前后缀length=next[length-1];}}}
}//匹配
void insert(string &str, string &insert_str, vector<int>& next){cout<<"next数组为:"<<endl;for(int a=0;a<next.size();a++){cout<<next[a]<<" ";}int i=0;int j=0;int num=0;while(i<str.size()){num++;cout<<"第"<<num<<"次匹配,匹配到原字符串的第"<<i<<"位"<<str[i] <<endl;if(str[i]==insert_str[j]){cout<<"第一项匹配成功"<<endl;i++;j++;if(j==insert_str.size()){cout<<"原字符串为:"<<str<<endl;cout<<"匹配成功,从第"<<i-j+1<<"个字母开始"<<endl;cout<<"匹配内容为:";for(int k=i-j;k<i-j+insert_str.size();k++){cout<<str[k];}cout<<endl;cout<<"匹配次数为:"<<num<<endl;return;}}else{if(j!=0){cout<<"匹配失败,回溯至";j=next[j-1];cout<<"位置"<<j<<endl;cout<<str[i-j]<<"处"<<endl;}else{i++;}}}cout<<"匹配次数为:"<<num<<endl;cout<<"匹配失败"<<endl;}void violent(string str, string insert_str) {int i = 0; // 主串指针int j = 0; // 模式串指针int num = 0; // 匹配尝试次数计数器while (i < str.size()) {num++;if (str[i] == insert_str[j]) {i++;j++;if (j == insert_str.size()) {// 成功匹配cout << "匹配成功" << endl;cout << "匹配子串为:";for (int k = i - j; k < i; k++) {cout << str[k];}cout << endl;cout << "匹配次数为:" << num << endl;return;}} else {i = i - j + 1; // 回退到本次匹配起始位置的下一个字符j = 0;         // 重置模式串指针}}// 匹配失败cout << "匹配失败" << endl;cout << "总共尝试匹配次数为:" << num << endl;
}
int main(){string insert_str="aaad";vector<int> next(insert_str.size());getNext(insert_str,next);string str="daaaaaad";insert(str,insert_str,next);violent(str,insert_str);return 0;}

next即为需找位置得str的next

这里我还写了一个暴力破解的

我们来分析一下次数是怎么来的

aaad的next为0120

如果是暴力算法,次数为1+4+4+4+4=17

1是因为第一项不符合直接过,4是因为我构造的是aaad,所以他每次都要判断4次才能确定

如果是kmp,次数为1+4+2+2+2=11

在我们4比完后,j=2对应next数组为2,我们直接用2号位[第三个字母]去和之前p对应去比,

发现可以,那么值需要接着我往下比就好了,str的1,2字母无须比较,故为2,少比两个

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

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

相关文章

博士,超28岁,出局!

近日&#xff0c;长沙市望城区《2025年事业引才博士公开引进公告》引发轩然大波——博士岗位年龄要求28周岁及以下&#xff0c;特别优秀者也仅放宽至30周岁。 图源&#xff1a;网络 这份规定让众多"高龄"博士生直呼不合理&#xff0c;并在社交平台掀起激烈讨论。 图源…

使用Nuitka打包Python程序,编译为C提高执行效率

在 Python 的世界里&#xff0c;代码打包与发布一直是开发者关注的重要话题。前面我们介绍了Pyinstaller的使用&#xff0c;尽管 PyInstaller 是最常用的工具之一&#xff0c;但对于性能、安全性、兼容性有更高要求的项目&#xff0c;Nuitka 正迅速成为更优的选择。本文将全面介…

基于机器学习的恶意请求检测

好久没写文章了&#xff0c;忙毕业设计ING&#xff0c;终于做好了发出来。 做了针对恶意URL的检测&#xff0c;改进了杨老师这篇参考文献的恶意请求检测的方法 [网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习-CSDN博客 选择使用了XGBoost算法进…

深入理解XGBoost(何龙 著)学习笔记(五)

深入理解XGBoost&#xff08;何龙 著&#xff09;学习笔记&#xff08;五&#xff09; 本文接上一篇&#xff0c;内容为线性回归&#xff0c;介绍三部分&#xff0c;首先介绍了"模型评估”&#xff0c;然后分别提供了线性回归的模型代码&#xff1a;scikit-learn的Linear…

工业级MySQL基准测试专家指南

工业级MySQL基准测试专家指南 一、深度风险识别增强版 风险类型典型表现进阶检测方案K8s存储性能抖动PVC卷IOPS骤降50%使用kubestone进行CSI驱动压力测试HTAP读写冲突OLAP查询导致OLTP事务超时用TPCH+Sysbench混合负载测试冷热数据分层失效压缩表查询耗时激增10倍监控INNODB_C…

Spring WebFlux和Spring MVC的对比

原文网址&#xff1a;Spring WebFlux和Spring MVC的对比-CSDN博客 简介 本文介绍Spring WebFlux和Spring MVC的区别。 Webflux&#xff1a;是异步非阻塞的&#xff08;IO多路复用&#xff09;&#xff0c;基于Netty。适合网络转发类的应用&#xff0c;比如&#xff1a;网关。…

解析401 Token过期自动刷新机制:Kotlin全栈实现指南

在现代Web应用中&#xff0c;Token过期导致的401错误是影响用户体验的关键问题。本文将手把手实现一套完整的Token自动刷新机制&#xff0c;覆盖从原理到实战的全过程。 一、为什么需要Token自动刷新&#xff1f; 当用户使用应用时&#xff0c;会遇到两种典型场景&#xff1a;…

《解构线性数据结构的核心骨架:从存储模型到操作范式的深度解析》

线性数据结构概述 线性数据结构是数据元素按线性顺序排列的集合,每个元素有唯一的前驱和后继(除首尾元素)。常见类型包括数组、队列、链表和栈,每种结构在存储和操作上具有独特特性。 线性表:顾名思义,线性表就是数据排成像一条线的结构。每个线性表上的数据最多只有前和后…

HW蓝队工作流程

HW蓝队工作流程 由多领域安全专家组成攻击队&#xff0c;在保障业务系统安全的前提下&#xff0c;直接在真实网络环境开展对抗&#xff0c;对参演单位目标系进行可控、可审计的网络安全实战攻击&#xff0c;通过攻防演习检验参演单位的安全防护和应急处置能力&#xff0c;提高…

语音相关-浏览器的自动播放策略研究和websocket研究

策略详情 媒体参与度 AudioContext音频API的实现 new Audio音频API的实现 相关实践 网页端 使用new Audio创建的音频对象进行音频播放的时候&#xff0c;如果用户没有与页面进行交互&#xff0c;那么会报错如下&#xff1a; 使用AudioContext创建的对象播放音频&#xff0c;…

Linux操作系统网络服务模块一DHCP服务概述

前言&#xff1a; 在Linux网络服务体系架构中&#xff0c;​DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;​​ 作为核心服务之一&#xff0c;承担着局域网内主机网络参数动态分配的关键任务。其设计初衷是解决传统手动配置IP地址的效率瓶颈与错误风…

FPGA基础 -- Verilog语言要素之变量类型

Verilog 变量类型&#xff08;Variable Types&#xff09; 一、什么是变量类型&#xff1f; 在 Verilog 中&#xff0c;变量类型用于保存过程赋值结果&#xff08;由 always 或 initial 块赋值&#xff09;&#xff0c;通常用于建模寄存器、状态、计数器等“带记忆”的硬件行为…

使用Haporxy搭建Web群集

目录 一、案例分析 1.案例概述 2.案例前置知识点 2.1 HTTP请求 2.2 负载均衡常用调度算法 2.3常见的Web群集调度器 3.案例环境 3.1本案例环境 二、案例实施 1.搭建两台web服务器 2.安装Haproxy 3.haproxy服务器配置 修改haproxy的配置文件 4.测试web群集 5.haproxy的日…

pikachu靶场通关笔记38 目录遍历(路径遍历)

目录 一、目录遍历 二、源码分析 三、目录遍历与文件包含 四、实战渗透 1、进入靶场 2、目录遍历 &#xff08;1&#xff09;访问ace.min.css &#xff08;2&#xff09;访问fileinclude.php 本系列为《pikachu靶场通关笔记》渗透实战&#xff0c;本文通过对目录遍历源…

现代C++:std::string全方位碾压C字符串

在 C 中引入的 std::string 是对 C 语言中 char* 和 const char* 的一种现代化封装和增强。它不仅解决了 C 字符串的许多缺陷&#xff08;如安全性、内存管理、易用性等&#xff09;&#xff0c;还提供了丰富的 API 来简化字符串操作。本文将从多个维度详细对比 std::string 与…

20250619周四:Atlassian

今天主要把conference上的A xxx的所有资料大体看了一遍&#xff0c;花了两个多小时。 公司的这个conference系统&#xff0c;共实就是一个大型的可多人在线编辑的文件系统。差不多所有的资料都共享在上面。这对于多人参与的项目管理&#xff0c;还是相当方便的。 Atlassian最特…

通过CDH安装Spark的详细指南

通过CDH安装Spark的详细指南 简介 Cloudera Distribution of Hadoop (CDH) 是一个企业级的大数据平台,它集成了多个开源组件,包括Hadoop、Spark、Hive等。本文将详细介绍如何通过CDH安装和配置Spark。 前提条件 在开始安装之前,请确保满足以下条件: 已安装CDH集群具有管…

GitLab CVE-2025-5121 安全漏洞解决方案

本分分享极狐GitLab 补丁版本 18.0.2, 17.11.4, 17.10.8 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任…

【八股消消乐】Elasticsearch优化—检索Labubu

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本专栏《八股消消乐》旨在记录个人所背的八股文&#xff0c;包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

如何实现基于场景的接口自动化测试用例?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 自动化本身是为了提高工作效率&#xff0c;不论选择何种框架&#xff0c;何种开发语言&#xff0c;我们最终想实现的效果&#xff0c;就是让大家用最少的代码&…