数据结构(4):串

只需要掌握小题,在考纲中占比不大

1 串的定义

1.1 基本定义

字符串

数据结构三要数:逻辑结构、存储结构、运算

子串必须是连续的! 空格也是一个字符!每个空格字符占1B

1.2 串和线性表

2 串的基本操作

比值的操作!:就是按照字母表的顺序排列!

只有当两个串完全相同时,才相等!

字符串编码表ASCII

a存的是:【高四位】0110【低四位】0001【这样的二进制】

结果就是:

空格这个字符对应的二进制数是:00010000 占8bit位置

一个字母占一个字节1B ,一个字节等于8比特

软件的解码方式出现了错误!

3 串的存储结构

串是特殊的线性表

3.1 顺序存储

malloc申请的空间是一个堆区域,堆区的空间需要手动free

优点:随机存取 缺点:插入删除很困难

不同的方案数:

方案二的缺点:char[0]存储的还是一个字节的大小,占8个比特位,也就是说只能表示0到255之间的数字,则字符串的长度不能超过255.

方案四可以有所有的优点!

3.2 链式存储

一个字符1B(字节),一个指针4B(字节),这样造成的存储密度低的问题可以通过每个结点存储多个字符解决!!!如果最后一个结点存不满的话就可以用特殊的字符代替,这里式#也可以是/0这样子。

优缺点:增加删除元素很简单但是不具备随机存储的特性!

3.2.2 求子串

sub返回内容

3.2.3 比较两个串的大小

3.2.4 定位操作

一直找新的长度为3的子串!

4 字符串匹配!!!!!!

4.1 朴素模式匹配算法

朴素模式匹配算法可以看作是 暴力解决!  思想:找出所有长度为6的子串和模式串对比!

一共有n-m+1个子串,最多对比n-m+1个子串

4.1.1 用index

取子串、对比两个字符串的操作

4.1.2 不使用基本操作

i= i-j+2   i-j会使指针指向这个子串的前面一个位置 +2之后就指向了下一个子串的起始位置!

停止的条件:j>T.length reture i-j+1  或者 i-T.length

代码实现:

时间复杂度

暴力解法:把所有有可能的都遍历一遍!

前面的都匹配只有最后一个元素不匹配

4.2 KMP算法

利用模式串本身的信息 和已经扫描过的信息

当模式串进行失配的时候应该跳到什么样的位置。

所以只要是总结模式串的信息!!!!!

当模式串很短 但是主串很长的时候KMP就会后高效!

可以用数组表示这些信息:当在某个位置发生失配的时候会成什么局面!

在进行匹配之前要对模式串进行预处理得到next数组!!

不需要子串的那个指针变化,只变化模式串的

时间复杂度

手动的求next数组!!!

求next数组【一】

注意模式串的位序是从1开始的,0表示的是模式串第一个元素的前面一个元素!

1:next【1】=0 在任何的模式串中都一样!

2:next【2】=1在任何的模式串中都一样!

3:其他的画出分界线后 一步一步挪动然后填表!

使用next数组:

过程:

1:i=6 j=6 不匹配 j = next[6]=1 

2:i=6 j=1 不匹配 j = next[1] = 0

3:j=0时特殊处理》》j++,i++

4:i=7 j=1 匹配成功

5:i = 11 j=5 不匹配 j = next[5] = 2

6:i=11,j=2 匹配成功

自己算一下

KMP算法的进一步优化

对next数组进行优化!变成nextval数组!!!逻辑没有改变!

优化思路:

可以直接将next[3]=0 

因为此时i的位置一定不是a 所以一定和j=1不匹配,因此直接将指针置为0

next[5]=1  但并不是所有的next数组都可以进行优化!

思路:看失配的字符和所指的字符是否相等,如果相等的话没必要再回到这个位置了,直接回到这个位置的前一个位置即可!!!!

通过next数组求nextval数组

next[1]无脑写0

直接跳到后一步就可以!

nextval【j】 = nextval【next【j】】

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

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

相关文章

rocketmq做了哪些事情来提高性能

在中间件和消息队列的领域内,Apache RocketMQ是一个高性能、高吞吐量的分布式消息中间件,它被广泛应用于处理大规模消息服务的构建中。为了达到这样的性能标准,RocketMQ不仅在架构设计上进行了优化,还在代码层面进行了大量的重构和…

走的人多了,也便成了路(七)

好多年前就听到这样的说法:一流的企业做标准,二流的企业做品牌,三流的企业做产品。 在通信行业待久了,经历了移动通信技术标准的发展历程,体会到很多事情没有那么神秘,甚至由于一些偶然因素的出现&#xff…

AIGC之MetaHuman:HeyGen(基于AI驱动的视频生成平台+数字人)的简介、安装和使用方法、案例应用之详细攻略

AIGC之MetaHuman:HeyGen(基于AI驱动的视频生成平台数字人)的简介、安装和使用方法、案例应用之详细攻略 目录 HeyGen的简介 1、HeyGen是一款AI视频生成平台,它提供以下关键功能: HeyGen的安装和使用方法 1、使用方法 01创建或选择一个头…

Flutter金融理财类APP常用的第三方库总汇

Flutter金融理财类APP常用的第三方库总汇 金融理财类APP在现代社会中扮演着越来越重要的角色,为用户提供了便捷的金融服务和投资渠道。Flutter作为一个高效的跨平台移动应用开发框架,能够帮助开发者快速构建这类应用。本文将汇总Flutter金融理财类APP开…

Java中的动态代理机制及其应用

动态代理(Dynamic Proxy)是Java语言中一种强大的特性,允许在运行时动态地创建代理类。代理类可以拦截对目标对象的所有方法调用,并在调用前后执行一些额外的逻辑。动态代理在Java的许多框架中得到了广泛应用,比如Spring AOP(面向切面编程)、Hibernate、MyBatis等。本文将…

数据中心基础设施智能运维

数据中心基础设施智能运维 随着科技的飞速发展,数据中心作为信息社会的核心基础设施,扮演着越来越重要的角色。然而,传统的运维模式由于对人力资源的高度依赖,已无法满足现代数据中心对高效、安全和可持续运维的要求。华为的《数…

vue实现stompjs+websocket和后端通信(二)

vue项目的搭建在这里就不说了,网上有很多教程。大家自行百度。前端使用stompwebsocket有很多的实现版本。这里只讲stomp/stompjs方式实现。 导入 使用stomp/stompjs需要执行安装命令: import Stomp from stomp/stompjs; 然后在组件中引入即可&#xff…

探索国内大模型AIGC产品

​ 人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗…

2. keepalived结合LVS配合使用

keepalived结合LVS配合使用 1、后端nfs存储提供项目文件2、后端nfs上集中安装MySQL,共用数据库3、业务服务器通过LNMP正常部署wordpress博客,客户端通过DNS解析可正常访问4、所有业务服务器上修改arp参数、配置VIP5、配置keepalived实现LVS高可用5.1 kee…

web前端电影简介标签:深度解析与创意应用

web前端电影简介标签:深度解析与创意应用 在web前端开发中,电影简介标签的设计与实现是一项既具挑战性又充满创意的任务。这些标签不仅需要准确传达电影的核心信息,还要通过精美的设计和交互效果吸引用户的眼球。本文将从四个方面、五个方面…

Python私教张大鹏 Vue3整合AntDesignVue之Dropdown 下拉菜单

基本用法 核心代码&#xff1a; <template><a-dropdown><a class"ant-dropdown-link" click.prevent>Hover me<DownOutlined /></a><template #overlay><a-menu><a-menu-item><a href"javascript:;"…

软件心学格物致知篇(7)软件开发文档写什么

软件心学格物致知篇(7)软件开发文档写什么 前言 当今约束大家生产力的有哪些因素&#xff1f;是编程语言&#xff1f;开发框架&#xff1f;开发IDE&#xff1f;还是自身迫切需要更高水平的技能&#xff1f; 好像上面的每一项技术都在不断发展&#xff0c;也在不断的为我们生…

Spring Event如何优雅实现系统业务解耦

Spring Event如何优雅实现系统业务解耦 一、介绍 Spring事件&#xff08;Spring Event&#xff09;是Spring框架的一项功能&#xff0c;它允许不同组件之间通过发布-订阅机制进行解耦的通信。在Spring中&#xff0c;事件是表示应用程序中特定事件的对象&#xff0c;例如用户注…

java-HashMap 的底层原理

HashMap 是 Java 中最常用的映射数据结构&#xff0c;它存储键值对&#xff08;key-value pairs&#xff09;&#xff0c;并允许使用任何非空对象作为键或值。HashMap 的底层原理主要依赖于数组和链表&#xff08;或红黑树&#xff09;来实现键值对的存储和检索。 以下是 Hash…

嵌入式必会的几条ARM汇编指令

就这几条混个面熟就行 读内存指令&#xff1a;LDR&#xff0c;即Load之意写内存指令&#xff1a;STR&#xff0c;即Store之意加减指令&#xff1a;ADD、SUB跳转&#xff1a;BL&#xff0c;即Branch And Link入栈指令&#xff1a;PUSH出栈指令&#xff1a;POP 此处是学习韦老师…

在win11系统上安装启动Hyper-V

Hyper-V 是微软公司开发的一种虚拟化技术&#xff0c;它允许一台物理计算机运行多个操作系统和应用程序&#xff0c;从而提供更好的资源利用率和系统灵活性。 win系统的linux子系统开启、android studio的虚拟环境都需要这个东西&#xff0c;而在初始的win11系统上可能没有这个…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:电力巡检智能机器人

聚焦数字经济与双碳经济赛道&#xff0c;专注于提供集中式新能源场站与分布式综合能源数智化整体解决方案&#xff0c;坚持以场站数字化、综合能源数字化双轮驱动发展。依靠专业化人才队伍与丰富的实证基地研究经验&#xff0c;打造成熟、先进的数智新能源研发平台。 在集中式新…

【面经总结】Java基础 - 面向对象

面向对象 什么是面向对象 https://www.bilibili.com/video/BV1wZ4y1B7A7 以对象为核心。 类是对象创建的模板&#xff0c;对象是类的实例。 面向对象三大特性是什么 封装&#xff1a;类的创建者将类具体实现隐藏&#xff0c;使用者只需要使用外部接口即可继承&#xff1a;类…

常用sql

–page– jpa里面的&#xff0c;需要-1Pageable pageable PageRequest.of(pageNumber - 1, pageSize, Sort.by(“classId”).descending()); RepositoryImpl里面的pageable不需要-1 queryListForMySql(sql, pageable, BeanPropertyRowMapper.newInstance(DingStudentDto.class…

Docker Swarm集群部署管理

Docker Swarm集群管理 文章目录 Docker Swarm集群管理资源列表基础环境一、安装Docker二、部署Docker Swarm集群2.1、创建Docker Swarm集群2.2、添加Worker节点到Swarm集群2.3、查看Swarm集群中Node节点的详细状态信息 三、Docker Swarm管理3.1、案例概述3.2、Docker Swarm中的…