数据结构串

简介: 数据结构串

串的定义和操作

定义

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

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

串的存储结构

  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;
}

#### 求一个模式串的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的**
目录
相关文章
|
运维 监控 Java
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
全网最全的内存溢出CPU占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
3842 5
|
存储 NoSQL 算法
【C语言】《C语言基础指南!》- 史上最全!
通过上述内容,你可以对 C语言 的基础知识有一个全面的了解。包括程序结构、数据类型、变量和常量、控制结构、函数、数组和字符串、结构体和联合、枚举和联合、预处理器指令、动态内存分配、文件操作、错误处理、编译器选项、调试和优化、C语言的标准库、编程技巧以及编程习惯等方面的详细讲解。希望这些内容能帮助你更好地理解和使用 C语言。
3231 5
|
Ubuntu 芯片 开发者
Ubuntu 25 ARM 桌面系统抢先版发布:第一个Ubuntu ARM桌面系统
Ubuntu 25.04 将于2025年发布,首次支持ARM Desktop桌面版系统,为ARM架构设备如Mac M系列芯片、Raspberry Pi等带来全新的桌面体验。用户可通过虚拟机或双系统安装在Mac上运行Ubuntu ARM,抢先体验版已开放下载:[链接](https://www.baihezi.com/ubuntu/arm/desktop)。此版本不仅扩展了Ubuntu的硬件兼容性,还提供了丰富的功能和流畅的操作体验,适合开发者和技术爱好者尝试。
5906 9
|
算法 程序员
从代码到哲学:编程中的启示与人生思考
在编写代码的过程中,我们不仅构建程序,也在无形中编织着生活的哲理。每一行代码都像是生命中的一步,它们共同构成了复杂而精彩的生命之旅。本文将从编程的角度出发,探讨技术实践中的深刻启示,以及这些启示如何影响我们对生活、工作和自我成长的理解。
428 3
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
972 0
|
小程序 数据挖掘 开发者
微信小程序项目实例——生活记账本
微信小程序项目实例——生活记账本
微信小程序项目实例——生活记账本
|
存储 文件存储 Android开发
如何让群晖Audio Station公开共享的本地音频公网可访问?
如何让群晖Audio Station公开共享的本地音频公网可访问?
|
人工智能 前端开发 JavaScript
Gradio快速入门
上一次分享中,我们创建了一个对话机器人,但是只能通过终端的方式进行交互。今天介绍一个 Python 库,可以快速搭建一套 UI 界面,不需要去学习 JavaScript、TypeScript 以及相关的前端技术了。并且,Gradio 渲染出来的界面可以直接在 Jupyter Notebook 里面显示出来,适合场景相对简单,想要快速部署应用的开发者快速体验产品效果。 如果你已经在 AI 领域深入多年,可以略过哈。
蓝桥杯——2019第十届C/C++真题[省赛][B组](一)
蓝桥杯——2019第十届C/C++真题[省赛][B组]
蓝桥杯——2019第十届C/C++真题[省赛][B组](一)
|
小程序 JavaScript 前端开发
微搭低代码零基础入门课(第三课)
微搭低代码零基础入门课(第三课)
微搭低代码零基础入门课(第三课)