数据结构与算法笔记

(五)串
串的定义:
由零个或者多个字符组成的有限序列。一般记为s = “a1a2a3a4……an”(n>0).其中s是串的名称,用双引号括起来的是字符串的值。串中字符串的数目n称为串的长度。零个字符串称为空串。所谓序列就是说明,串的相邻字符之间具有前驱和后继的关系。
(1) 空格串:只包含空格的串;有内容长度,可以不止一个空格;
(2) 子串与主串:串中任意个数的连续字符组成的子序列称为子串,相应地,包含子串的称为主串。

串的比较:串的比较是通过组成串的字符的ASCII码来进行的。
给定两个串:s = “a1a2a3a4……an”, t=”b1b2b3……bm”。比较大小:
(1)当n<m,且ai = bi 字符串s < t eg: s = hap t = happy
(2)存在某一个K<= min(n,m),使得ai = bi ,ak < bk 则字符串s < t
Eg: s= “happen” t = “happy” 前四个字母相同,第五个字符,e的ASCII码是101,y的ASCII码是121 所以s<t

串的抽象数据类型:
(1) 查找子串的位置(2)得到指定子串的位置(3)替换子串等操作
在这里插入图片描述

串的存储结构:顺序存储;链表存储

串的存储结构——顺序存储:
串的顺序存储结构是用一组地址连续的存储单元(定长数组)来存储串中的字符序列的。按照预定义大小,为每个定义的串变量分配一个固定长度的存储空间。
带来的问题是,对字符串进行操作,有可能会使得串序列的长度超过数组预定义的长度。串值得存储空间可以在程序执行过程中动态分分配。在堆区由malloc()函数和free()函数管理。

串的存储结构——链式存储:
串的链式存储,一个结点可以存放一个或者多个字符,最后一个结点没有被占满时,可以使用#或者其他非串字符补全。
在这里插入图片描述

朴素的模式匹配算法:
子串的定位操作通常称作串的模式匹配。
例:从 S =”goodgoogle”中,找到 T = “google”这个子串的位置,步骤如下:
(1)主串S第一位开始,S与T前三个字母都匹配成功,但S第四个字母不同,即第一位匹配失败
在这里插入图片描述

(2) 主串S第二位开始,S的首字母是o,但是要匹配的首字母是g,匹配失败。
在这里插入图片描述

(3)主串S第三位开始,S的首字母是o,但是要匹配的首字母是g,匹配失败。
在这里插入图片描述

依次类推;
在这里插入图片描述

(5)主串S第五位开始,S与T,完全匹配成功。
在这里插入图片描述
简单的说,就是对主串的每一个字符作为子串的开头,要与匹配的字符串进行匹配对比。对主串做一个大循环,每个字符开头做长度为T的小循环,直到匹配成功或者完全遍历完成为止。

KMP模式匹配算法:
克努特-莫里斯-普拉特算法(KMP算法),可以大大避免重复遍历情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值