三、串(字符串)

news2024/11/20 9:45:22

一、定义及常见术语

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
串相等:当两个串的长度相等且对应位置上的字符都相同时,这两个串才是相等的

所有的空串都是相等的

二、两种存储结构

2.1顺序存储结构(更常用)

#define MAXLEN 255
typedef struct {
    char ch[MAXLEN+1];//存储串的一维数组
    int length;//串的当前长度长度
} SString;

2.2 链式存储结构

#define CHUNKSIZE 80
typedef struct Chunk{
	char ch[CHUNKSIZE + 1];
	struct Chunk *next;
}Chunk;//串的结点类型

typedef struct {
	Chunk *head, *tail;//串的头、尾指针 
	int length;//串的当前长度 
}LString;//串的块链结构 

三、模式匹配算法

目的:确定主串中所含字串 (模式串) 第一次出现的位置

应用:搜索引擎、拼写检查、语言翻译、数据压缩

3.1 BF算法 (Brute-Force)

将主串的第pos个字符和模式串的第一个字符比较
若相等,继续逐个比较后续字符
若不等,从主串的下一字符开始,重新和模式串的第一个字符比较

int Index_BF(SString S, SString T, int pos) {
    int i = pos, j = 1;//为了方便描述,这里的sstring类的第零位置不储存元素
    while (i <= S.length && j <= T.length) {
    //若第一个不符合,则匹配失败;若第二个不符合,则匹配成功
        if (s.ch[i] == T.ch[j]) ++i, ++j;//主串和字串依次匹配下一个字符
        else {i = i-j+2; j = 1;} //回溯
        //i=i-j+2,理解为i-(j-1)+1。j从1到j走了j-1步,则i也走了j-1步。减j-1后再+1,是回到主串原来开始匹配的下一个位置
    }
    if (j > T.length) return i-T.length;
    else return 0; //模式匹配不成功
}
//主串长n,子串长m,时间复杂度O(n*m),复杂度较高。
 

在这里插入图片描述

3.2 KMP算法

可参考:KMP算法易懂版

补充:包含首字母,不包含尾字母的所有子串都称为前缀,包含尾字母,不包含首字母的所有子串都称为后缀
找最长的(长度小于比较指针左端子串长度的)公共前后缀
不需要看主串,只需要将模式串的相关信息提取出来之后就可以与任意的主串进行匹配。
公共前后缀的长度需小于比较指针左侧子串的长度
移动后,比较指针左侧子串的长度即为公共前后缀的长度
模式串的“最大公共前后缀长度+1”号位与主串当前位进行比较即可。

示例:
在这里插入图片描述

int Index_KMP(SString S, SString T, int pos) {
    int i = pos, j=1;
    while (i < S.length && j<=T.length) {
        if (j == 0 && S.ch[i] == T.ch[j]) ++i, ++j;
 //j == 0是因为当j退到0时,也就是主串的第i个字符与模式串的第一个字符不等时,应从主串的第i+1个字符重新与模式串的第一个字符作比较
        else j = next[j]; 
        //i不变,j后退,这里利用了一个next数组来存放j要飞到的位置,而不是每一次都从头开始
    }
    if (j > T.length) return i-T.length;//返回第一个字符的下标,匹配成功
    else return 0; //模式匹配不成功
}
 
void get_next(SString T, int &next[]) {//获得next数组,记录j的坐标位置
    i = 1; next[1] = 0; j = 0; 
	while (i < T.length) {
        if (j == 0 || T.ch[i] == T.ch[j]) {
            ++i; ++j;
            next[i] = j;
        }
        else j = next[j];
    } 
} 
//具体来说就是,j回溯改成,让模式串中模式匹配不成功位置之前的串中的最长前后缀的前缀到后缀位置,这样就推动了j的后移
//下图是示意图,其中next记录的是j可以飞到的位置,也就是最长公共前后缀的长度+1,注意最长前后缀的长度要小于不同位置之前串的长度才行!

可以提速到O(n+m)
利用已经部分匹配的结果而加速模式串的滑动

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

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

相关文章

Flink Shuffle 3.0: Vision, Roadmap and Progress

摘要&#xff1a;摘要&#xff1a;本文整理自阿里云高级技术专家宋辛童 (五藏)&#xff0c;在 FFA 2022 核心技术专场的分享。本篇内容主要分为五个部分&#xff1a;Flink Shuffle 的演进流批融合云原生自适应Shuffle 3.0Tips&#xff1a;点击「阅读原文」查看原文视频&演讲…

Node.js--》模块化、npm与包的讲解与使用

目录 模块化 Node.js中模块的分类 模块作用域 模块的加载机制 npm与包 npm包管理工具的安装与使用 包管理配置文件 包下载速度 包的分类 发布包 模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对整个系统来说&#xff0…

数据湖---hudi简介

文章目录hudi是什么核心概念TilelineTable TypesQuery Types特性官网 hudi是什么 apache hudi是下一代流式数据湖平台。hudi将数仓和数据库的核心功能带到了数据湖。提供表、事务、高效的upsert、delete&#xff0c;高级索引&#xff0c;流式注入服务&#xff0c;数据集群、压…

圣诞特辑 · Three.js加载圣诞树模型

&#x1f384;2022年圣诞节到来啦&#xff0c;很高兴这次我们能一起度过~&#x1f384; 文章目录&#x1f389;前言&#x1f50e;预览&#x1f381;项目&资源项目源码地址打包运行✒️编码实现&#x1f389;前言 2022圣诞节来了&#xff0c;让我们一起使用Three.js实现导入…

渗透测试-ctfshow 爆破(web入门)

大家可以关注一下我的公众号-小白渗透测试&#xff0c;互相学习。 web1 打开环境 先随便输入一个账号密码&#xff0c;使用bp进行抓包分析。 可以看到&#xff0c;账号密码进行了base64加密&#xff0c;使用工具进行解密&#xff0c;可以看到是账号:密码这样一个格式。 然后我…

JavaSE笔记——函数式编程(Lambda表达式)

文章目录前言一、第一个Lambda表达式二、如何辨别Lambda表达式三、引用值&#xff0c;而不是变量四、函数接口五、类型推断总结前言 Java 8 的最大变化是引入了 Lambda 表达式——一种紧凑的、传递行为的方式。 一、第一个Lambda表达式 Swing 是一个与平台无关的 Java 类库&a…

数组与集合有什么不同之处

这个问题其实就是一个非常基础的面试题&#xff0c;一般面试官想了解你基础知识方面的掌握时&#xff0c;基本都会问这个问题&#xff0c;尤其是一些&#xff0c;计算机学子毕业之后&#xff0c;如果还是想要从事计算机技术相关的行业时&#xff0c;那么在面试的时候就需要做好…

Faster RCNN网络源码解读(Ⅰ) --- Fast RCNN、Faster RCNN论文解读

目录 一、Fast R-CNN论文解读 二、Faster R-CNN论文解读 一、Fast R-CNN论文解读 Fast R-CNN是作者Ross Girshick继R-CNN后的又一力作。同样使用VGG16作为网络的backbone&#xff0c;与R-CNN相比训练时间快9倍&#xff0c;测试推理时间快213倍&#xff0c;准确率从62%提升至66…

Win10家庭版安装Docker桌面版

文章目录1.主板BIOS中开启虚拟化2.开启Hyper-V&#xff08;1&#xff09;使用下列代码生成一个.cmd文件&#xff0c;并以管理员身份运行该文件。&#xff08;2&#xff09;看到运行成功即可关闭该文件。&#xff08;3&#xff09;勾选Hyper-V设置里的所有选项&#xff08;4&…

2-2-3-10、并发设计模式

目录终止线程的设计模式Two-phase Termination&#xff08;两阶段终止&#xff09;模式——优雅的终止线程使用场景避免共享的设计模式Immutability模式——想破坏也破坏不了如何实现使用 Immutability 模式的注意事项Copy-on-Write模式应用场景Thread-Specific Storage 模式—…

这几个实用的微信功能,你该知道

生活中我们每天都会使用到微信&#xff0c;用了10年才发现&#xff0c;原来微信隐藏这么多神功能&#xff0c;真是太实用了&#xff0c;下面一起来看看吧&#xff01;朋友圈发长视频 如果你想要在朋友圈里分享长视频&#xff0c;可以借助微信收藏“转发”到朋友圈。 在收藏里添…

一位普通前端开发的一年|2022总结

前言 2022年转眼快要结束&#xff0c;在这一年我学到了很多东西&#xff0c;现在就来总结一下我的2022&#xff0c;复盘一下过去一年的成果。 总结 在2022年2月底从上一家公司跳槽&#xff0c;面试了两家公司两家拿到了两个offer&#xff0c;当时感觉自己很厉害&#xff0c;…

jdk-Atomic源码学习

上文&#xff1a;AQS-Exchanger源码学习源码下载&#xff1a;https://gitee.com/hong99/jdk8Atomic了解atomic是并发框架中的一员&#xff0c;所属位置&#xff1a;java.util.concurrent.atomic 该类主要是用来解决内存可见性、有序、线程安全&#xff0c;当然底层也是通过cas来…

NEUQ week8 动态规划

题目 P1616 疯狂的采药 题目背景 此题为纪念 LiYuxiang 而生。 题目描述 LiYuxiang 是个天资聪颖的孩子&#xff0c;他的梦想是成为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到一个…

贪吃蛇基础·框架版(简单)结尾有原码

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

PSM倾向得分匹配代码和案例数据

PSM倾向得分匹配代码和案例数据 含义&#xff1a;倾向评分匹配&#xff08;Propensity Score Matching&#xff0c;简称PSM&#xff09;是一种统计学方法&#xff0c;用于处理观察研究&#xff08;Observational Study&#xff09;的数据。 在观察研究中&#xff0c;由于种种…

【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动

前言 iMX6Q 支持多种启动方式&#xff0c;如 emmc启动、SD 卡启动等&#xff0c;这里简单的记录一下 SD卡启动的流程 下载u-boot 使用 NXP 官方提供的 uboot-imx&#xff0c;代码地址为&#xff1a; https://github.com/nxp-imx/uboot-imx 使用 git 下载 uboot-imx&#xff…

自动驾驶接力赛,还在继续奔跑的Apollo带来哪些改变?

自动驾驶&#xff0c;被看作人工智能技术落地最快、范围最广、引发商业效应最显著的场景之一。从人人好奇的无人车&#xff0c;到满大街司空见惯的无人配送&#xff0c;自动驾驶在过去几年里快速成熟&#xff0c;成为城市交通系统的重要组成部分。数据显示&#xff0c;2020-203…

融云 CEO 董晗:国产化进程加速,助推政企数智办公平台深化发展

完整报告关注公众号&#xff0c;限免下载 政策催化加疫情助推下&#xff0c;办公线上化迅速完成着市场教育已经成为当前的主流趋势。而随着“国产化”成为各行业数字化发展道路上的关键词&#xff0c;政企办公领域国产替代的发展确定性更加凸显。关注【融云 RongCloud】&#x…

hnu计网实验四-网络层与链路层协议分析(PacketTracer)

一、实验目的&#xff1a; 通过本实验&#xff0c;进一步熟悉PacketTracer的使用&#xff0c;学习路由器与交换机的基本配置&#xff0c;加深对网络层与链路层协议的理解。 二、实验内容&#xff1a; 4.1 路由器交换机的基本配置 打开下面的实验文件&#xff0c;按提示完成实…