【数据结构与算法】字符串匹配 - 暴力算法

字符串模式匹配朴素暴力算法与KMP算法C++实现(附图精讲) 字符串模式匹配问题的两种算法 问题描述 给定文本串 t ,与模式串 p,要求从文本串 t 中找出第一次出现模式串 p 的位置。 基本的匹配算法(暴力求解) 思路 文本串t从i=0开始,模式串p从就开始,依次比较,如图 当出现不匹配时,j回溯首位,i++,再次依次按位比较。想法朴素,简单,但是每次相当于p串只向后移动了一位。 暴力法代码(C++): #include <iostre... 阅读详情

【数据结构与算法】字符串匹配 - 暴力算法

通过CTRL + F查找文本这种操作相信每个人都有,在一段文本中查找另外一段文本,这个操作就叫做字符串的模式匹配,比如在AABABCDEF中查找ABCD,那么AABABCDEF被叫做文本串(也叫主串),ABCD被叫做为模式串,通常主串的长度使用N来表示,模式串的长度使用M来表示,上面两个串的匹配情况如下图所示:
匹配
正如上图绿色部分那样,文本串中包含模式串,结果就是匹配到了。

字符串模式匹配的算法有很多,比如暴力算法、KMP算法、BM算法、BK算法等,一一来介绍。

BF算法

BF算法也叫做暴力算法,思路简单,很容易理解,首先将文本串和模式串左对齐,如果出现不匹配的情况,则模式串整体向后移动一位,否则就匹配了,依然拿下图来说明:
匹配

两个串左对齐开始匹配,如下图:

红色处字符不相等,则停止比较后面的字符,将整个模式串向后移动,再次匹配:
不匹配

红色处字符也不相等,则继续向后移动模式串,重新匹配:
在这里插入图片描述
红色处字符也不相等,则继续向后移动模式串,重新匹配:
在这里插入图片描述

此时找到了匹配结果。

通过上面的图解分析,其实能够很好地总结出匹配的步骤:

  1. 循环文本串,文本串中的当前字符(当前指针指向的字符)开始向后以此与文本串比较。
  2. 比较的时候,如果遇到字符不相等的情况,那么就需要停止比较,文本串指针需要向后移动一位,继续与模式串比较(从模式串头开始以此比较)
  3. 如果与模式串的所有字符以此比较都相等,那么说明匹配到了。

按照上面的分析,我可以定义一个指针i指向文本串,定义一个指针j指向模式串:

第一次匹配:

在这里插入图片描述
本次匹配,以为i = 0, j = 0开始匹配,当j = 1的时候字符不匹配(text[i + j] != pattern[j]),也就是text[1] != pattern[1],接下来指针i要向后移一位,而指针j则需要设置为0,继续匹配。

第二次匹配:
在这里插入图片描述
匹配以i = 1开始,当j = 2的时候字符不匹配text[i + j] != pattern[j],也就是text[3] != pattern[2],此时指针i需要继续向后移动一位,指针j还是回到头部

第三次匹配:
在这里插入图片描述
匹配以i = 2开始,当j = 0的时候字符不匹配text[i + j] != pattern[j],也就是text[2] != pattern[0],此时指针i需要继续向后移动一位,指针j还是回到头部

第三次匹配:
在这里插入图片描述
匹配以i = 3开始,找到了模式串,但是j还是会向后移动的,此时j等于模式串的长度m。

代码如下:

class Solution {
   
   
    pu
字符串匹配算法之暴力做法(朴素算法) 阅读详情

相关推荐

字符串模式匹配(查找算法)

KMP算法——著名的模式匹配算法。KMP算法的特点是i不回退,如果S[i]=T[j]时,则i++,j++,继续比较;如果S[i]≠T[j],j回退到next[j],重新开始比较。算法关键是计算next[]数组。此例从图中观察可看出T的前两个字符无需比较,那么一般情况怎么确定T的前几个字符不需要比较了呢?i指向字符的前两个字符和T串中j指向字符的前两个字符一样,不一样就不会i++,j++比较当前位置元素了。那么T的前几个字符无需比较可以根据T串确定。继续探究不需要比较几个字符。

qq_55078860的博客 1276

Python与西门子PLC数据交互实战:基于Snap7的跨平台工业通信指南

本文详细介绍了如何使用Python和Snap7库实现与西门子PLC的数据交互。内容涵盖跨平台环境搭建、连接参数配置、数据读写实战及性能优化技巧,为工业自动化、数据采集和智能制造场景提供了一套轻量、灵活且高效的通信解决方案。

vim8coder的博客 282

别再只盯着YOLOv8了!手把手带你用PaddleDetection的PP-YOLOE+搞定你的第一个检测项目

本文介绍了PP-YOLOE+在目标检测领域的优势与应用实践,对比YOLOv8展示其在精度、速度和部署便利性上的突破。通过详细的代码示例和实战教程,帮助开发者快速上手PaddleDetection工具链,实现产业级目标检测项目,提升开发效率。

weixin_42701915的博客 184

scratch航天梦主题课程作品分享,包含ppt、素材包

而今年多国都将发射探测器尝试登陆月球,2023年或将称为“登月年”,请大家发挥创新思维,以“星辰大海”为创作主题,搜集相关信息 、展开联想,为实现升空 、探测 、取样贡献创意!即使去淘宝买的素材,也要从百度网盘,但素材太多大了或者太多文件,也要充值百度网盘超级会员才能保存,提高下载速度。同学们大家好,今天我们就要开始航天主题-嫦娥五号探月工程系列的编程课程了,不仅可以学习到很多航天知识,了解本次嫦娥五号的发射历程,还能让我们用编程遨游太空呢。即使下载了,也要上传,不是特别方便,尤其是不好查找。

少儿编程吕口口 2481

腾讯股票接口API(1)——根据股票代码获取详情

获取股票简要信息,找来找去也没有找到官方的文档,都是复制粘贴的,这里先简单记录一下。 1.简要信息 以贵州茅台为例: http://qt.gtimg.cn/q=s_sh600519 // sh600519是贵州茅台的股票代码,根据自己的关键字拼接URL 可以直接在Android项目中请求,会得到如下一串字符串: v_s_sh600519="1~贵州茅台~600519~2075.95~42.95~2.11~38930~794942~~26078.04~GP-A"; 这里v_s代表简要信息,sh600519

GeofferySun的专栏 6万+

告别QXDM:在Android Studio中调试与验证高通NV读写功能的完整流程

本文详细介绍了在Android Studio中调试与验证高通NV分区读写功能的完整流程,替代传统的QXDM工具。通过JNI接口层、HAL服务层和Diag通信层的架构设计,开发者可以在熟悉的IDE环境中高效完成NV操作,包括环境配置、错误处理和性能优化等关键实践。

weixin_27013291的博客 261

香橙派5使用RK3588S内置NPU加速yolov5推理,实时识别数字达到50fps

香橙派5采用了RK3588S,内置的NPU达到了6Tops的算力,博主这里记录一下自己的踩坑过程,好不容易做出来的不能以后忘记了(手动狗头)。这里博主还在B站上发布了效果视频,大家感兴趣的话可以看一下。其中解决了先验框标注位置不对,或者出现非常多的框的问题

weixin_51651698的博客 2万+

强化学习优化多目标冲突推理的决策过程设计

1. 背景介绍 强化学习(Reinforcement Learning,RL)作为机器学习的一个重要分支,近年来在计算机科学和人工智能领域取得了显著的进展。其核心思想是通过试错来学习最优策略,从而在复杂的环境中实现目标。然而,在多目标冲突推理(Multi-Objective Conflict Reasoning,MOCR)问题上,强化学习面临着诸多挑

AI天才研究院 1510

“软开关”硬技术!ZVS和ZCS到底谁更牛?看完这个例子你就懂了!

❌ ZVS 和 ZCS 是万能的?→ 不,它们都有实现条件,谐振参数选不好照样硬拐弯!❌ 只要有谐振就一定ZVS?→ 不,一定要设计合适的死区时间和负载条件才行!ZVS 是让电压先“冷静”,ZCS 是让电流先“退场”。一个是开门不撞墙,一个是关门不甩门。懂了它们,功率设计就是在跳华尔兹而不是打架!💃🔌。

weixin_43199439的博客 1237

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 【力扣】28. 找出字符串中第一个匹配项的下标
下一篇: 【数据结构与算法】字符串匹配 - RK算法
「已注销」
博客等级 码龄3年 128粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值