数据结构(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】】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

定个小目标之刷LeetCode热题(13)

今天来看看这道题,介绍两种解法 第一种动态规划,代码如下 class Solution {public int maxSubArray(int[] nums) {int pre 0, maxAns nums[0];for (int x : nums) {// 计算当前最大前缀和pre Math.max(pre x, x);// 更新最大前缀和maxAns Math.ma…

入门级的卷积神经网络训练识别手写数字-小白轻松上手-含数据集+pyqt界面

代码下载地址: https://download.csdn.net/download/qq_34904125/89374845 本代码是基于python pytorch环境安装的。 下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。 或可直接参考下面博文…

arm开发板移植sshd

移植sshd 文章目录 移植sshd1、准备工作2、编译zlib3、编译openssl4、编译openssh5、其他旧版本6、部署测试7、多用户配置8、sshd_config示例 1、准备工作 准备openssh-9.5p1.tar.gz openssl-1.1.1w.tar.gz zlib-1.2.11.tar.gz 我在http://10.45.156.100/IG2100/IG2100.git …

向AI请教如何说不

面对父母的催婚,你可以采取以下几个步骤来进行沟通和表达自己的立场: 理解与尊重:首先,要理解父母催婚背后的关心和期望。他们可能出于对你未来幸福和生活稳定的考虑。表达对他们关心的感激,这有助于建立良好的沟通基础…

SAS:coalescec函数和cmiss函数的应用及拓展

背景:CRF中收集了每个受试者3个RACE方面的信息,SDTM SPEC规定了RACE的生成规则为:若收集了多个RACE,RACE“MULTIPLE”,详细的RACE信息记录在SUPPDM中;若仅收集到一个RACE,则RACE等于RACE1-RACE3…

程序猿大战Python——流程控制——while循环

程序里的循环 目标:了解循环语句的作用。 在程序中,有时候会遇到代码需要重复多次运行的情况。 例如,一起来完成: (1)在生活中做事没让媳妇儿满意,跟她承认错误,说10遍&#xff1a…

【Linux】进程7——进程地址空间

1.再谈fork 之前提到了fork之后对父子进程返回不同的id值,给父进程返回子进程的pid,给子进程返回0,所以对于一个id如何存储两个值的说法,在我们之前已经提到过了一个概念叫做写时拷贝,就是在子进程要想修改父进程的id…

JavaScript学习|JavaScript 引入方式、JavaScript 基础语法、JavaScript 对象、BOM、DOM、事件监听、事件绑定

JavaScript 能做什么 1.能够改变文本内容 2.能够改变图像的src属性值 3.能够进行表单验证等 JavaScript 引入方式 内部脚本 1.内部脚本:将 JS代码定义在HTML页面中&#xff0c;JavaScript代码必须位于<script>与</script>标签之间。在 HTML 文档中可以在任意地…

三维地图Cesium,加载一个模型,模型沿着给定的一组经纬度路线移动

目录 实现效果 实现思路 功能点 选择移动路线 加载模型和移动路线 重新运行 指定位置(经纬度点)开始移动 视角切换 到站提示 运行 停止 联动接口 完整代码 html js逻辑 trainOperation.js sourceData.js gitee仓库项目代码 疑问解答 实现效果 三维地图Cesiu…

热题系列章节5

169. 多数元素 给定一个大小为 n 的数组&#xff0c;找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出:…

shell编程(三)—— 运算符

和其他编程语言一样&#xff0c;bash也有多种类型的运算符&#xff0c;本篇对bash的相关运算符做简单介绍。 一、运算符 1.1 算术运算符 常见的算术运算符&#xff0c;如加&#xff08;&#xff09;、减&#xff08;-&#xff09;、乘&#xff08;*&#xff09;、除&#xf…

简单介绍一下vim

简单介绍一下vim 一、vim是什么&#xff1f;二、vim的优点三、vi/vim的使用命令模式输入模式底线命令模式 四、vi/vim 按键说明&#xff08;一&#xff09;命令模式可用的光标移动、复制粘贴、搜索替换等移动光标的方法:搜索替换的方法删除、复制与贴上的方法 &#xff08;二&a…

嵌入式Linux系统编程 — 3.5 utime、utimes、futimens、utimensat函数修改文件时间属性

目录 1 文件的时间属性简介 2 utime()函数 2.1 utime()函数简介 2.2 示例程序 3 utimes()函数 3.1 utimes()函数简介 3.2 示例程序 4 futimens()函数 4.1 futimens()函数简介 4.2 示例程序 5 utimensat()函数 5.1 utimensat()函数简介 5.2 示例程序 1 文件的时间…

如何从SD存储卡恢复已删除的图像

SD卡概述 在日常工作和学习中&#xff0c;SD卡经常被用作许多设备上的存储设备&#xff0c;例如数码相机&#xff0c;手机&#xff0c;摄像机&#xff0c;行车记录仪以及监控设备&#xff0c;用于为我们存储图像&#xff0c;视频&#xff0c;文档&#xff0c;音频和其他数据。…

html5实现个人网站源码

文章目录 1.设计来源1.1 网站首页页面1.2 个人工具页面1.3 个人日志页面1.4 个人相册页面1.5 给我留言页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/139564407 ht…

12. Django 第三方功能应用

12. 第三方功能应用 因为Django具有很强的可扩展性, 所以延伸了第三方功能应用. 通过本章的学习, 读者能够在网站开发过程中快速实现API接口开发, 验证码生成与使用, 站内搜索引擎, 第三方网站实现用户注册, 异步任务和定时任务, 即时通信等功能.12.1 Django Rest Framework框…

【YOLOv5进阶】——修改网络结构(以C2f模块为例)

一、站在巨人的肩膀上 这里我们借鉴YOLOv8源码&#xff1a; 上期说到&#xff0c;对于网络模块定义详情在common.py这个文件&#xff0c;如Conv、CrossConv、C3f等。本期要修改的需要参考YOLOv8里的C2f模块&#xff0c;它定义在YOLOv8的module文件夹的block.py文件里&#xf…

js调试过程中修改变量值

1.在想要变更的地方添加断点 2.添加监视表达式 3.执行网页代码&#xff0c;当执行到断点处则会停止 4.点击执行下一步&#xff0c;则会执行监视表达式

新材料正不断推动模具3D打印行业发展

随着工业4.0的浪潮席卷全球&#xff0c;模具制造行业也迎来了技术革新的新纪元。3D打印技术以其独特的制造优势&#xff0c;正逐渐在模具制造领域崭露头角。然而&#xff0c;要实现模具3D打印技术的广泛应用&#xff0c;高性能的打印材料是不可或缺的关键因素。 材料是模具3D打…

一、Socket创建和连接

C网络编程&#xff08;asio&#xff09; 文章目录 C网络编程&#xff08;asio&#xff09;1、Asio概述2、网络编程基本流程2、创建socket3、创建监听socket4、绑定accpet监听套接字5、连接指定的端点6、服务器接收连接 点击查看代码 1、Asio概述 ​ Asio起源于Boost库&#xf…