回顾串的朴素模式匹配

突破该死的无回溯模式匹配算法 突破该死的无回溯模式匹配算法关键字:无回溯模式匹配本文是我研究张乃孝的《算法与数据结构-C语言描述(第二版)》中第三章“字符串”的无回溯模式匹配算法(P77)时的一些心得。这个算法只有简单的几行,却让我看了差不多两个晚上才看懂。为了让后来人不至于跟我一样花同样或甚至更多的时间在理解它上面(当然肯定还有不少比我厉害的牛人,你们就不用看了^_^)。特写下此心得。请在阅读以前,先让自己的心静下来 阅读详情

一 概述

关于串的朴素模式匹配中我们应该先了解主串,子串,模式串之间的关系:

主串:任何一个字符串都可以作为主串如:S = 'HelloWorld'。

子串:一般理解为某个主串的子串,如主串S的字串可以有:'Hello','World'。由此可以发现子串一定是某主串中存在的连续字符串才叫做子串。

模式串:模式串只要满足串的概念即可,同时模式串匹配是希望在某一指定的主串中找到该串,但不要求一定存在。

二 串的模式匹配

串的模式匹配是指在主串中找到与模式串相同的子串,并返回其所在位置。

在串的模式匹配过程中我们需要进行定位操作:若主串S中存在于串T值相同的子串,则返回它在主串S中第一次出现的位置,否者函数值为0。

三 通过串的基本操作实现串的朴素模式匹配

操作步骤:

1. 确定一个主串和一个模式串。

2. 将模式串与主串进行对比,如果第一个字符相同则比较后续字符。

3. 如果后续字符都相同则直接返回首字符的位置。

4. 如果后续字符中存在不同的字符,则将模式串整体往后移一位,然后重复1的步骤。

5. 继续进行2的判断,若满足则返回结束,如不满足则继续步骤3。

串的朴素模式匹配中串的基本操作实例

//静态数组定义串,静态数组实现定长顺序存储,当有关静态数组实现的代码执行成功后,其所占的空间会自动被回收。
typedef  struct{
    char ch[MAXLEN]; //每个分量存储一个字符串。
    int length;  //串的实际长度。
}SString;

//求子串,用Sub返回串S的第pos个字符起长度为len的子串
bool SubString(SString *Sub,SString S, int pos, int len){

    //子串范围越界
    if(pos+len-1 > S.length){
        return false;
    }

    for(int i = pos; i < pos + len; i++){
        Sub->ch[i-pos+1] = S.ch[i];
        Sub->length = len;
    }
    return true;
}

//子串与主串的比较操作。若S>T,则返回值 > 0; 若S = T, 则返回值 = 0; 若S < T, 则返回值 < 0
int StrCompare(SString S,SString T) {
    for (int i = 1; i <= S.length && i <= T.length; i++) {
        if(S.ch[i] != T.ch[i]) {
            return S.ch[i] - T.ch[i];
        }
    }
    //扫描过的所有字符都相同,则长度长的串更大
    return S.length - T.length;
}

//定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置,否则函数值为0.
int Index(SString S, SString T) {
    int i = 1, n = S.length, m = T.length;
    SString *sub;
    while(i <= n-m+1) {
        SubString(sub,S,i,m);
        if(StrCompare(*sub,T) != 0) ++i;
        else return i; //返回子串在主串的位置
    }
    return 0;   //S中不存在与T相同的子串
}

四 模式匹配算法的性能分析

当主串长度为M,而模式串的长度为m

最好时间复杂度:匹配成功时最好情况的时间复杂度为O(m)。匹配失败时最好的时间复杂度为O(M-m+1)。

由于很多实际的应用场景中,主串要比模式串长的多,即M>>m。所以O(M-m+1) ≈ O(M)。

最坏时间复杂度:因为直到匹配成功/匹配失败最多需要(M-m+1)*m次比较,同上因为在很多的实际应用场景中,主串要比模式串长的多,即M>>m,所以此时的时间复杂度为O(Mm)。

新手必看:5分钟搞定Unitree Go1机器狗Gazebo仿真运动控制(附按键图解) 本文为新手提供了Unitree Go1机器狗在Gazebo仿真环境中实现运动控制的快速指南。通过5分钟极简配置和按键图解,帮助开发者快速掌握宇树科技明星产品的基础操作,包括环境搭建、仿真启动和运动控制技巧,适合零基础用户快速上手。 阅读详情

相关推荐

激光及激光器超全细节&原理总结

本文详细展示了激光、激光器、PN结、半导体激光器、光纤激光器的原理和应用;

guangwulv的博客 5355

串的匹配:朴素匹配&KMP算法

引言 字符串的模式匹配是一种常用的操作。模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern)。通常文本都很大,而模式则比较短小。典型的例子如文本编辑和DNA分析。在进行文本编辑时,文本通常是一段话或一篇文章,而模式则常常是一个单词。若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是很高的。 模式匹配的朴素算法 最简单也最容易想到的是朴素匹配。何为朴素匹配,简单讲就是把模式串跟母串从左向右或从右向左一点一点比较:

CCPP Blog 4663

MagicDraw-需求图

MagicDraw学习笔记

木头征的博客 4136

数据结构——串(朴素的模式匹配算法、KMP模式匹配算法)

数据结构——串(朴素的模式匹配算法、KMP模式匹配算法) 键盘上的钢琴师_v5 提示:以下内容不适合零基础人员,仅供笔者复习之用。 概要: 串是由零个或多个字符组成的有限序列,又名叫字符串。 一、串的比较 给定两个串,s = "a1a2.....an",t="b1b2....bm",当满足以下条件之一时,s<t。 n<m,且ai = bi(i=1,2,.....,n)。例如,s="hap",t="happy",就有s<t。 存在某个k<=min(m,n),使得...

cxu123321的博客 3159

STM32F103C8T6心电采集实战:从PCB设计到上位机开发的完整指南(附TI杯开源资料)

本文详细介绍了基于STM32F103C8T6的心电采集系统开发全流程,从PCB设计到上位机开发,特别适合大学生电子设计大赛参赛者参考。内容涵盖硬件设计精要、软件算法优化及上位机开发技巧,并附TI杯开源资料,帮助开发者低成本实现医疗级心电信号采集。

kafka6courier的博客 194

WhatsApp网页版扫码分析

扫码登录本质上是WhatsApp的多设备登录,设备之间可以独立运行,那么当我们首次通过WhatsApp扫码登录二维码时,到底发生了那些事情?交换了那些数据?

SocialMarketing的博客 5230

模式匹配算法

1.朴素的模式匹配算法——BF算法 int Index_BF(char*s ,char*t) { int i=1,j=1; while(i<=s[0]&&j<=t[0])/*都没有遇到结束符*/ if(s[i]==t[i] { i++;j++; }/*继续*/ else { i=i-j+2;j=1; if((s[0]-i)<t[0]-j))/*字符串不够匹配了*/

cenxihan的博客 701

Mplus实战:三变量随机截距交叉滞后模型(RI-CLPM)语法详解与扩展

本文详细解析了Mplus中三变量随机截距交叉滞后模型(RI-CLPM)的构建原理与语法实现。通过将变量分解为稳定的个体间差异与动态的个体内波动,模型能更纯净地揭示多变量间的纵向交互影响。文章以工作压力、睡眠质量与工作满意度为例,提供了完整的语法模板、关键参数设置(如NOCOV命令、残差相关)及结果解读指南,帮助研究者避开常见误区,稳健分析复杂动态关系。

wdx0123456的博客 927

python模式匹配算法_串匹配(朴素模式匹配算法)

串的匹配有两种方式,一种是静态方式顺序存储,另一种是动态方式堆存储。这两种方式都是基于顺序表和链表实现的。串的朴素算法是利用子串的长度来依次匹配子串长度的主串的部分字符,这样就可以每次比较子串长度的字符直到结束。代码如下:#include #include #include #define MaxSize 255/* run this program using the console pause...

weixin_39697660的博客 629

Vivado新手必看:5分钟搞定FPGA程序固化到Flash(附MCS文件生成全流程)

本文为FPGA新手详细解析了如何将程序固化到Flash存储器的完整流程。核心在于理解SRAM工艺FPGA断电易失的特性,并利用Vivado工具将比特流文件转换为Flash可识别的MCS文件。文章重点拆解了生成MCS文件的关键配置步骤、硬件连接要点,以及通过JTAG烧写Flash的实战操作,并提供了常见启动失败问题的排查清单,帮助开发者实现设计从调试到产品部署的关键跨越。

weixin_29230901的博客 352

Prometheus+Grafana+alertmanager+PrometheusAlert监控告警 实现飞书告警

以上 是以grafana做的邮件告警,但是感觉邮件很少人看。下面是以webhook 可以接入。启动alertmanager (设置 开机在启动)下载prometheusalter 配置文件。这里的告警是基于grafana上搭建的。我们启动PrometheusAlert。写完之后进行重启Prometheus。prometheus 的告警规则。测试 基于我们生产环境做的文档。然后在grafana上导模板。上导入模板就可以 直接引用。访问 grafana页面。重启一下grafana。

墨痕诉清风的博客 859

数据结构——串

互异的非平凡子串(非空且不同于主串本身)的数目为n(1+n)-1。长度为n的字符串,子串数目为n(1+n)\2+1;3、串是一种特殊的线性表,其特殊性体现在数据元素时一个字符。1、子串主串的一部分,一定存在;N=''N为空格串。模式串不一定能在主串中找到。2、M=‘’M为空串。...

yyy_zxc的博客 3787

一文吃透 SAP IDoc 状态码:从 TEDS1 到 WE02 排障,再到 ABAP 自动化监控

在 SAP 集成场景里,IDoc 往往是最常见、也最容易被低估的一条生命线:采购订单、发票、主数据、库存移动……只要系统之间要稳定地交换结构化业务数据,IDoc 就经常登场。真正让人头疼的,并不是 IDoc 本身,而是它在链路里到底走到了哪一步、卡在了哪里、该找谁背锅。这篇文章把常用的 IDoc 状态码按出站、入站拆开讲清楚,并且把每个状态对应的真实世界故障现象、排查入口、以及可以落地的 ABAP 监控代码串起来,让你看到状态码就能想到动作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 405

软件设计师之朴素的模式匹配算法

该算法也称为布鲁特一福斯算法,其基本思想是从主串的第一个字符起与模式串的第一个 字符比较,若相等,则继续逐一对字符进行后续的比较,否则从主串第二个字符起与模式串的 第一个字符重新比较,直到模式串中每个字符依次和主串中一个连续的字符序列相等时为止, 此时称为匹配成功。如果不能在主串中找到与模式串相同的子串,则匹配失败。 假设主串和模式串的长度分别为n和位置序号从0开始计算,下面分析朴素模式匹配 算法的时间复杂度。设从主串的第i个位置开始与模式串匹配成功,且在前i趟匹配中(位置0~ i-1),每趟不成功的匹配

GodSure0914的博客 1397

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

考研数据结构——(串、朴素模式匹配与KMP)

串一、 串1.1 串与线性表的区别1.2 字符集与ASCII表1.3 小知识回顾框架二、 串的存储方式2.1 串的存储方式2.1.1 顺序存储2.1.2 链式存储2.2 截取字串算法2.3 获取子串在主串的位置2.4 小的知识回顾框架 一、 串 1.1 串与线性表的区别 串其实就是特殊的线性表; 串通常操作 对象是 字串; 1.2 字符集与ASCII表 1.3 小知识回顾框架 二、 串的存储方式 2.1 串的存储方式 2.1.1 顺序存储 顺序存储时的四个方案,表示串长! 2.

Seven597的博客 534

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据结构--字符串的朴素模式匹配算法

字符串的朴素匹配算法

m0_60593173的博客 891

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

BDS之串的模式匹配

KMP算法是由Knuth(D.E.Knuth)、Morris(J.H.Morris)和Pratt(V.R.Pratt)三人设计的。

天将降大任于斯人.... 817

[入门必看]数据结构4.2:串的模式匹配

数据结构4.2:串的模式匹配

m0_58991879的博客 1360

4.1 串的定义和基本操作、存储结构、朴素模式匹配算法

1. 串的定义和基本操作 1.1 知识总览 1.2 串的定义 1.3 串 vs 线性表 1.4 串的基本操作 1.5 串的比较操作 1.6 字符集编码 1.7 拓展:乱码问题 1.8 知识回顾 2. 串的存储结构 2.1 知识总览 2.2 串的顺序存储 2.3 串的链式存储 2.4 基本操作的实现 2.4.1 求子串 2.4.2 比较操作 2.4.3 定位操作 2.5 知识回顾 3. 朴素模式匹配算法 3.1 什么是模式匹配? 3.2 朴素模式匹配算法 3.3 朴素模式匹配算法性能...

qq_26553393的博客 361

【数据结构】串

串(String),又称为字符串,是由零个或多个字符组成的有限序列。一般记作,其中S为串名,双引号括起来的内容是串的值,ai1 ≤ i ≤ n)表示串中的单个字符,n称为串的长度。当n = 0时,称之为空串,它不包含任何字符。需要注意的是,空格字符组成的串(例如" ")也是有长度的,长度为空格的个数,并非空串。另外,还有子串的概念,串中任意个连续的字符组成的序列称为该串的子串,例如,对于串"bcd"就是它的一个子串,而包含原串的那个串称为主串。

Guiat的博客 1802

数据结构基础:串的朴素模式匹配算法

1 什么事模式匹配 2 使用基本操作实现模式匹配 3 朴素模式匹配算法 4 另一种实现方式 5 朴素模式匹配算法性能分析 6 知识回顾

GeekDongHuang的博客 375

串 Part 4-2

KMP模式匹配算法、next数组值推导、KMP模式匹配算法实现

qq_44777344的博客 756

2023王道考研数据结构第四章---串

2023王道考研数据结构第四章---串

weixin_52572034的博客 680

字符串的模式匹配

前言:记得大二学习字符串匹配也只是把书上的伪代码看懂,原理搞明白,也就没有亲自去实现代码,而且自己也不是搞算法的,所以偶尔做题也很少遇到字符串匹配题,上次考试很尴尬遇到了这种题,虽然知道考的啥,但是写不出代码,很是尴尬,所以今天就花点时间把知识回顾一下,并把代码实现。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_30371469的博客 280

2024重生之回溯数据结构与算法系列学习(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】

数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!

跟我加入白帽大家庭,共捍亿万互联网用户安全! 2503

24考研数据结构-第四章:串

数据结构串的概念与匹配算法

VengaZ的学习博客 700
上一篇: Git config --global user.email or user.name
下一篇: KMP算法中的next[i]和nextval[i]的规律回顾
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值