数据结构串

简介: 数据结构串

串的定义和操作

定义

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

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

串的存储结构

  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占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
3907 5
|
算法 程序员
从代码到哲学:编程中的启示与人生思考
在编写代码的过程中,我们不仅构建程序,也在无形中编织着生活的哲理。每一行代码都像是生命中的一步,它们共同构成了复杂而精彩的生命之旅。本文将从编程的角度出发,探讨技术实践中的深刻启示,以及这些启示如何影响我们对生活、工作和自我成长的理解。
456 3
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
1005 0
|
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的硬件兼容性,还提供了丰富的功能和流畅的操作体验,适合开发者和技术爱好者尝试。
6223 9
|
小程序 数据挖掘 开发者
微信小程序项目实例——生活记账本
微信小程序项目实例——生活记账本
微信小程序项目实例——生活记账本
|
Shell 网络安全 开发工具
全面概述Gitee和GitHub生成/添加SSH公钥
全面概述Gitee和GitHub生成/添加SSH公钥
626 0
全面概述Gitee和GitHub生成/添加SSH公钥
|
前端开发 算法 JavaScript
Jetpack Compose Runtime : 声明式 UI 的基础
Jetpack Compose 不只是一个 UI 框架,更是一个通用的 NodeTree 管理引擎。这一切得益于 compose.runtime 的存在。
9219 0
|
2天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
7905 34
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
2天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
680 145
|
2天前
|
人工智能 缓存 自然语言处理
阿里Qwen3.7-Max评测:Agent能力显著提升,耗时与调用成本大幅下降
阿里云百炼推出面向智能体的旗舰大模型Qwen3.7-Max,具备长周期自主执行能力,显著提升编程、办公自动化等复杂任务处理水平;支持MCP集成与多框架兼容,并以限时5折+100万Tokens免费试用大幅降低使用门槛,助力企业高效落地AI应用。在阿里云百炼平台快速体验:https://t.aliyun.com/U/fPVHqY
1899 10