408数据结构------3.串

串的定义和操作

定义

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

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

串的存储结构

  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]的办法
    在这里插入图片描述
    next数组的那个数所对应的S字符如果和目前S的字符一样,那就把前面那个的nextval的值抄过去
    在这里插入图片描述
    如果两个字符不一样,那就把目前字符的next数组抄下去
    nextval[1]是一直等于0的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
王道408数据结构的应用题是指在408考试出现的与数据结构相关的实际应用题目。在这些题目,可能会涉及到顺序查找、折半查找、分块查找等算法。王道书给出了这些算法的代码实现,但对于考408的同来说,掌握这些代码并不是必须的,因为408的代码题没有像自主命题那样深入和难度那么大。对于线性表的顺序表示、以及栈和队列的实现,也不需要手写实现,可以使用标准库来解决问题。只有在题目要求你手动实现栈和队列等数据结构时,才需要进行手写实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [408王道数据结构强化——应用题](https://blog.csdn.net/JiangNan_1002/article/details/125828454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【23考研】计算机408数据结构代码题强化阶段划重点(王道书)](https://blog.csdn.net/qq_50710984/article/details/125583743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值