数据结构串

简介: 数据结构串

串的定义和操作

定义

==串是限定了元素为字符的线性表==

串增删改查通常以子串为操作对象,而线性表主要针对表内的某一个元素

串的存储结构

  1. 顺序存储:
    在这里插入图片描述
    最大长度为10
  2. 链式存储:
    每个节点一个or多个字符

模式匹配

- 基本概念:
子串:一定是在主串中存在的才叫子串
模式串:尝试在主串中找的串,未必存在
模式匹配:在主串中找到与模式串相同的子串,并返回其位置

朴素模式匹配

  1. 思路:
    主串中与模式串长度相同的所有子串搞出来,挨个与模式串对比,有一个字符不匹配时,立即放弃当前子串,转而索引下一个子串
  2. 代码实现:
    在这里插入图片描述

KMP算法

  1. 引入原因:
    在朴素模式匹配算法最坏的情况中,主串指针向前走m步,回退m-1步,模式串也不断在回退,导致算法时间复杂度很高
    只有在子串与模式串经常能部分匹配的时候,kmp才比朴素模式匹配优秀很多,其实也没有优秀很多
  2. 思路:
    让主串不会退,每轮比较只回退模式串的指针
    用next数组来标记模式串回退的位置,j=k且发现字符不匹配时,模式串指针回溯到j=next[k]
  3. KMP代码
int INDEX_KMP(SString S,SString T,int next[]){
int  i= 1,j=1;
while(i<=S.length&&j<=T.length){
if (j==0||S.ch[i]==T.ch[j]){
//注意j=0时,在最开始的位置就不匹配,此时i++,j++(因为规定next[1]=0)
    ++i;
    ++j;
}
else
    j=next[j];//模式串向右移动
}
if(j>T.length)
    return i-T.length;//匹配成功
else
    return 0;
}
AI 代码解读

#### 求一个模式串的next数组

串的前缀 包含第一个字符但不包含最后一个字符的子串
串的后缀 包含最后一个字符但是不包含第一个字符的子串
==当第j个字符匹配失败,由前j-1个字符组成的串记为S:==
  • next[j] = S最长相等的前后缀长度+1
  • 前后缀是正着比较的,注意相等的前后缀可以有部分重叠
  • S为空,则next【j】等于0
  • S没有重叠的前后缀,next[j]等于1
  • 但是注意这个前后缀是不能完全重叠的,最起码也要差一个(就是前后缀的定义)
next[0]=空,
next[1]=0,
next[2]=1:前面只有一个字符

如果next【j】不等于0, i保持不动,j按照next回溯
如果next【j】等于0, i++,j++(也就是j=1) 模式串的第一个字符与主串i位置不匹配

KMP优化

1. 用nextval替代next,减少重复的比较

       2. 确定nextval[j]的办法
          ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/96d6dc0f826c4fd4b48d34b1af12736e.png?x-oss-process=imagewatermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiN5pmaeA==,size_20,color_FFFFFF,t_70,g_se,x_16)
          next数组的那个数所对应的S字符如果和目前S的字符一样,那就把前面那个的nextval的值抄过去
          ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/dc1d0113093a4102b9878074991a12e8.png?x-oss-process=imagewatermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiN5pmaeA==,size_20,color_FFFFFF,t_70,g_se,x_16)
          ==如果两个字符不一样,那就把目前字符的next数组抄下去==
          **nextval[1]是一直等于0的**
AI 代码解读
目录
打赏
0
0
1
0
29
分享
相关文章
深入理解Dockerfile:构建镜像的详细解释与常用命令(下)
Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
278 0
|
7月前
|
【C语言】《C语言基础指南!》- 史上最全!
通过上述内容,你可以对 C语言 的基础知识有一个全面的了解。包括程序结构、数据类型、变量和常量、控制结构、函数、数组和字符串、结构体和联合、枚举和联合、预处理器指令、动态内存分配、文件操作、错误处理、编译器选项、调试和优化、C语言的标准库、编程技巧以及编程习惯等方面的详细讲解。希望这些内容能帮助你更好地理解和使用 C语言。
1699 5
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
519 14
MySQL慢查询日志配置指南:发现性能瓶颈,提升数据库效率
MySQL慢查询日志配置指南:发现性能瓶颈,提升数据库效率
1356 0
【Kafka】Kafka 中消费者与消费者组的关系与负载均衡实现
【4月更文挑战第11天】【Kafka】Kafka 中消费者与消费者组的关系与负载均衡实现
关于数据仓库的Hive的Hive架构的用户接口的JDBC/ODBC
随着大数据技术的不断发展,数据仓库成为了企业中不可或缺的一部分。而Hive作为一种开源的数据仓库系统,因其易于使用和高效处理等特点,成为了许多企业的首选。然而,对于普通用户来说,直接使用Hive的命令行工具进行操作并不方便。因此,开发者社区中涌现出了大量的Hive GUI工具,其中最为流行的就是Web GUI工具。
428 1
Gradio快速入门
上一次分享中,我们创建了一个对话机器人,但是只能通过终端的方式进行交互。今天介绍一个 Python 库,可以快速搭建一套 UI 界面,不需要去学习 JavaScript、TypeScript 以及相关的前端技术了。并且,Gradio 渲染出来的界面可以直接在 Jupyter Notebook 里面显示出来,适合场景相对简单,想要快速部署应用的开发者快速体验产品效果。 如果你已经在 AI 领域深入多年,可以略过哈。
VB中判断空的几种方法,Null, Missing, Empty, Nothing, vbNullString区别
VB中判断空的几种方法,Null, Missing, Empty, Nothing, vbNullString区别
图片一共有多少种格式?区别分别是什么?底层原理是什么?
图片一共有多少种格式?区别分别是什么?底层原理是什么?
335 0
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等