4.2_1朴素模式匹配算法

知识总览:

什么是字符串的模式匹配:

主串:想从该串获取结果的串

模式串:想搜索的内容,不一定在主串中能搜到,子串一定能在主串中搜到

字符串模式匹配:在主串找模式串并返回找到的第一个模式串所在位置

 朴素模式匹配算法:

暴力匹配,从主串选取跟模式串长度一样的子串去跟模式串对比,俩串相等返回首字符下标,俩串不相等继续找,直到找到为止返回首字符下标或者找完也找不到为止。

实现方法1:Index()函数定位操作

跟上一节找主串的子串函数一样

注意目前的串都是用的静态数组且是数组第一个字符位置不适用的形式,即数组存储字符的下标跟字符位序相同,且找模式串可寻找的次数为n-m+1(n为主串,m为模式串)

实现方法2:不用Index()函数定位,使用指针

 第一轮:

设置2个扫描指针,分别扫描主串和模式串,指针指到哪则2个串的字符比较到哪,开始i和j分别指向主串S和模式串T的下标为1的第一个字符,分别为a和a即相等,则俩指针后移指向下标为2的第2个字符,都为b继续后移,来指针都指向第3个字符a都相等,继续后移指向第4个字符a相等,继续后移指向第5个字符都为b相等,继续后移此时俩指针都指向第6个字符,i指向主串S的a,j指向模式串的T的c,则俩字符不相等,指向主串的指针i回到指向下一个子串的第一个位置,即主串S的第2个字符位置,指向模式串的指针j回到模式串的第一个位置

i=i-j+2;//即此时i=6,j=6,下一轮i=i-j+2=2

//俩指向字符不相等时,j当前的值表示匹配到了子串的第几个字符,i-j就可以让i的值回到目前这个子串的前边一个位置,i和j都是统一往前移的,因为指针i要指向下一个子串的第一个位置,所以要在此基础上+2,如下图现在j指向了当前子串的第6个字符,i=6,j=6,i=i-j=0即i回到了这个子串的前边一个位置(注意是当前子串的前边一个位置,不是当前子串的第一个位置,这意味着要指向下一个子串的第一个位置要+2,因为+1就又指向当前子串的第一个位置了),然后还要刨除这个子串的第一个位置指向下一个字串的第一个位置,则要i=i+2=2

j=1;//即此时j=6,下一轮j=1,j指向模式串起始位置

第2轮: 

i的值恢复为2即i==2,j的值恢复为1即j==1,俩指针指向的值为b和a不相等,即i指向的当前子串和模式串不相等,则i=i-j=2-1=1即i回到当前子串b的前一个位置,i=i+2=3为指向下一个子串的第一个位置,指向模式串T的指针j回到模式串第一个位置即j==1

i=i-j+2;//即此时i=2,j=1,下一轮i=i-j+2=2-1+2=3

j=1;//即此时j=6,下一轮j=1,j指向模式串起始位置

 

第3轮:

上同,i从第3个字符开始的子串和j=1开始的模式串比较,每当发现i和j所指的字符相同的时候,让i和j分别+1,当i==4,j==2时不相等,i回到下一个子串的第一个位置,j回到起始位置

i=i-j+2;//即此时i=4,j=2,下一轮i=i-j+2=4-2+2=4

j=1;//即此时j=2,下一轮j=1,j指向模式串起始位置

 

第4轮:

每当发现i和j所指的字符相同的时候,让i和j分别+1,当j所指的位置超出了模式串的长度,就说明匹配成功,则返回当前子串的第一个字符位置即让i-j即可,注意没有+1,因为在匹配成功的时候i和j都已经往前移动了1个位置,所以当i-j的时候其实指向的位置为当前子串的第一个字符位置

 

代码版:

2个指针i和j,i指向主串,j指向模式串,初始值都为1即指向主串和模式串的第一个字符,如下while循环

if(S.ch[i]==T.ch[j]); ++i;++j;即当前2个指针指向的字符相等,让i和j都+1

i=i-j+2;j=1;即当前2个指针指向的字符不相等则让i回到下一个子串的第一个字符位置,j回到模式串第1个位置

return i-T.length;如果匹配成功,则说明j>T.length,已跳出while循环

return 0;;即匹配失败,即i已经把整个主串走了一遍,即在走到主串的最后一个字符时,不相等,i的下一轮下标为S.length+1(我怎么感觉S.length要比实际的字符个数多1个,因为S数组中存储的第一个位置没有存元素啊,比说最后一个字符index=3,实际S.length=4吧,那下一个位置i不就是4吗,那这个while循环不是还能走一遍吗,但是走的话if第一个语句就数组下标越界了吧。。。。。。。。。。。。。。。。)

 

最坏时间复杂度:

假如有如下长度为n的主串,长度为m的模式串,子串和模式串匹配的时候每次只有最后一个字符不相等,且主串n只有在最后一个m长度的子串中才和模式串匹配,即要总共匹配n-m+1次,每次都要匹配m个长度,则时间开销为(n-m+1)m=nm-m²+m,即时间开销为O(nm),因为一般n>>m,所以把m²舍去

 

 知识回顾:

。。。。。。。。。。。。。。。 

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

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

相关文章

华为云Flexus+DeepSeek征文|华为云ModelArts搭建Dify-LLM应用开发平台(AI智能选股大模型)

前言 在当今数字化时代,人工智能(AI)技术在金融领域的应用愈发广泛,其中 AI 智能选股大模型备受关注。为了构建高效且精准的 AI 智能选股大模型,选择合适的开发平台和工具至关重要。华为云 ModelArts 作为一款面向 AI …

C4.5算法深度解析:决策树进化的里程碑

C4.5是机器学习史上最经典的算法之一,由ID3之父Ross Quinlan在1993年提出。作为ID3的革命性升级,它不仅解决了前代的核心缺陷,更开创了连续特征处理和剪枝技术的先河,成为现代决策树的奠基之作。 本文由「大千AI助手」原创发布&am…

leetcode 65

#include <string> #include <vector> #include <unordered_map> using namespace std;class Solution { public:bool isNumber(string s) {// 定义状态转移表vector<unordered_map<char, int>> states {{{ , 0}, {s, 1}, {d, 2}, {., 4}}, // …

微服务(nacos+myibatis)中如何在一个模块调用多数据库源的一种方案

#nacos配置默认数据库 spring.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.datasource.driverNamecom.mysql.jdbc.Driver #默认数据库名 master spring.datasource.dynamic.primarymaster spring.datasource.dynamic.strictfalse spring.datasource.d…

高标准通信国际接轨,Ethercat与PROFINET网关实现全自动化生产线

在呼和浩特&#xff0c;集成商以其先进的食品饮料行业解决方案&#xff0c;为乳制品行业打造了一个智能化工厂的典范。这个工厂的核心是PROFINET全集成自动化&#xff08;TIA&#xff09;&#xff0c;它通过SIMATIC S7-1200 PLC和ethercat系统&#xff0c;构建了一个强大的PROF…

Netty 引用计数抽象类 AbstractReferenceCountedByteBuf 详解

核心类图 ----------------------------- ---------------------------------- | ReferenceCountUpdater | | AbstractReferenceCountedByteBuf | | <T extends ReferenceCounted>| | (extends AbstractByteBuf) | ----------…

用Python做一个手机镜头

文章目录 设置光学参数添加光学器件 设置光学参数 官方文档&#xff1a;设计手机镜头 rayoptics中提供了OpticalModel类&#xff0c;可用于创建光学模型对象。OpticalModel类中的【optical_spec】成员&#xff0c;是一个OpticalSpecs对象&#xff0c;可用于指定光圈、视野、光…

16.1 Python应用容器化终极指南:Dockerfile多阶段构建与安全优化实战

Python应用容器化终极指南:Dockerfile多阶段构建与安全优化实战 #mermaid-svg-6Yor3ONhmPaQAcY6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6Yor3ONhmPaQAcY6 .error-icon{fill:#552222;}#mermaid-svg-6Yor3ON…

基于SpringBoot + Vue打造的画师约稿平台实现

概述 基于SpringBoot Vue打造的画师约稿平台&#xff0c;该平台设计精美、功能完善&#xff0c;无论是想要搭建类似平台的开发者&#xff0c;还是对画师约稿系统感兴趣的人士&#xff0c;都能从中获取有价值的信息。 主要内容 ​​用户端功能​​&#xff1a; 如图所示&…

杰理-耳机-可视化sdk-最大音量提示音-7016G

杰理-耳机-可视化sdk-最大音量提示音 1.音量最大的时候发出消息 2.通过 MSG_FROM_AUDIO 进行发送 3.创建地方接收&#xff0c;并且播放提示音 学习q群:187115320

抖音图文带货权限怎么开通

在这个数字化营销蓬勃发展的时代&#xff0c;抖音作为一个流量巨大的平台&#xff0c;为广大创作者和商家提供了丰富的变现途径。其中&#xff0c;图文带货权限就是一个有效的拓宽变现能力的一个渠道。 那么&#xff0c;如何才能开通抖音的图文带货功能呢&#xff1f; 开通抖…

80、指标监控-Boot Admin Server

80、指标监控-Boot Admin Server Boot Admin Server是一个用于监控和管理Spring Boot应用程序的开源工具&#xff0c;以下是其相关介绍&#xff1a; #### 主要功能 - **应用状态监控** - 显示应用的在线状态、启动时间、运行时长等基本信息。 - 监控JVM指标&#xff0c;如内存…

Linux系统之Nginx反向代理与缓存

目录 一、正向代理和反向代理 1.1 正向代理概述 1.1.1 什么是正向代理 1.1.2 正向代理的作用 1.1.3 正向代理的基本格式 1.2 反向代理概述 1.2.1 什么是反向代理 1.2.2 反向代理可实现的功能 1.2.3 反向代理的可用模块 二、配置反向代理 2.1 反向代理配置参数 2.1.…

SpringBoot定时任务 - Timer实现方式

定时任务在实际开发中有着广泛的用途&#xff0c;本文主要帮助你构建定时任务的知识体系&#xff0c;同时展示Timer 的schedule和scheduleAtFixedRate例子&#xff1b;后续的文章中我们将逐一介绍其它常见的与SpringBoot的集成。 知识准备 需要对定时任务的使用场景和常见的实…

系统分析师学习笔记

系统分析师学习笔记 目录 系统分析师学习笔记前言1 数学与工程基础&#xff08;选择题2-4分&#xff09;1.1 图论与应用&#xff08;考选择题&#xff09;1.1.1 最小生成树1.1.2 最短路径1.1.3 网络与最大流量&#xff08;常考&#xff09; 1.2 预测与决策&#xff08;在原有基…

《仿盒马》app开发技术分享-- 逻辑优化第三弹(83)

技术栈 Appgallery connect 开发准备 现在我们的app功能已经趋近完善&#xff0c;bug和缺失的细节也越来越少了&#xff0c;我们继续对app进行优化&#xff0c;首先是我们的积分页面&#xff0c;我们只实现了全部的积分展示内容&#xff0c;对收入和支出的积分明细并没有进行…

(七)Dockerfile文件20个命令大全详解

目录 1. FROM 基于基础镜像构建 1.1 FROM 指令开头 1.2 ARG和FROM使用 1.3 FROM可以多个 1.4 AS name 1.5 tag和digest 2. RUN 执行任何命令 2.1 shell和exec两种使用方式 2.2 [OPTIONS]参数 3. CMD 指定默认执行命令 3.1 使用格式shell和exec两种使用方式 3.2 只…

攻防世界-MISC-4-2

知识点 1.字频分析 步骤 下载附件是一段文本&#xff0c; 在线网站处理&#xff1a;quipqiup - cryptoquip and cryptogram solver flag{classical-cipher_is_not_security_hs}

Nordic nRF54L15 SoC对包含电池监测、中断处理和电源轨控制的定制 nPM1300 示例

1&#xff1a;以下是适用于 nRF Connect SDK (NCS) 的基于 Zephyr 的示例应用程序&#xff0c;展示了&#xff1a; 读取电池电压和状态处理来自 nPM1300 的中断&#xff08;例如&#xff0c;电池或电源轨事件&#xff09;控制电源轨&#xff08;通过 GPIO 启用/禁用&#xff0…

MySQL 单机部署

文章目录 1、准备阶段1.1、部署规划1.2、硬件准备1.3、软件准备1.4、环境清理 2、实施阶段2.1、操作系统实施2.2、数据库部署实施 3、完成 1、准备阶段 1.1、部署规划 本次部署用于测试环境&#xff0c;单机模式&#xff0c;不需要主备&#xff1b;MySQL数据库版本要MySQL5.7…