字符串与字符串匹配
一、字符串简介
举个例子来说明:
str = "Hello World"
在示例代码中,str 是一个字符串的变量名称,Hello World 则是该字符串的值,字符串的长度为 11。该字符串的表示如下图所示:
二、字符串的比较
2.1 字符串的比较操作
两个数字之间很容易比较大小,例如 1 < 2。而字符串之间的比较相对来说复杂一点。字符串之间的大小取决于它们按顺序排列字符的前后顺序。
2.2 字符串的字符编码
以计算机中常用字符使用的 ASCII 编码为例。最早的时候,人们制定了一个包含 127 个字符的编码表 ASCII 到计算机系统中。ASCII 编码表中的字符包含了大小写的英文字母、数字和一些符号。每个字符对应一个编码,比如大写字母 A 的编码是 65,小写字母 a 的编码是 97。
ASCII 编码可以解决以英语为主的语言,可是无法满足中文编码。为了解决中文编码,我国制定了 GB2312、GBK、GB18030 等中文编码标准,将中文编译进去。但是世界上有上百种语言和文字,各国有各国的标准,就会不可避免的产生冲突,于是就有了 Unicode 编码。Unicode 编码最常用的就是 UTF-8 编码,UTF-8 编码把一个 Unicode 字符根据不同的数字大小编码成 1 ~ 6 个字节,常用的英文字母被编码成 1 个字节,汉字通常是 3 个字节。
三、字符串的存储结构
字符串的存储结构跟线性表相同,分为「顺序存储结构」和「链式存储结构」。
3.1 字符串的顺序存储结构
与线性表的顺序存储结构相似,字符串的顺序存储结构也是使用一组地址连续的存储单元依次存放串中的各个字符。按照预定义的大小,为每个定义的字符串变量分配一个固定长度的存储区域。一般是用定长数组来定义。
字符串的顺序存储结构如下图所示:
如上图所示,字符串的顺序存储中每一个字符元素都有自己的下标索引,下标所以从 0 开始,到 字符串长度 - 1 结束。字符串中每一个「下标索引」,都有一个与之对应的「字符元素」。
跟数组类似,字符串也支持随机访问。即字符串可以根据下标,直接定位到某一个字符元素存放的位置。
3.2 字符串的链式存储结构
字符串的存储也可以采用链式存储结构,即采用一个线性链表来存储一个字符串。字符串的链节点包含一个用于存放字符的 data 变量,和指向下一个链节点的指针变量 next。这样,一个字符串就可以用一个线性链表来表示。
在字符串的链式存储结构中,每个链节点可以仅存放一个字符,也可以存放多个字符。通常情况下,链节点的字符长度为 1 或者 4,这是为了避免浪费空间。当链节点的字符长度为 4 时,由于字符串的长度不一定是 4 的倍数,因此字符串所占用的链节点中最后那个链节点的 data 变量可能没有占满,我们可以用 # 或其他不属于字符集的特殊字符将其补全。
字符串的链式存储结构图下图所示:
如上图所示,字符串的链式存储将一组任意的存储单元串联在一起。链节点之间的逻辑关系是通过指针来间接反映的。
3.3 不同语言中的字符串
四、字符串匹配问题
字符串匹配(String Matching):又称模式匹配(Pattern Matching)。可以简单理解为,给定字符串 T 和 p,在主串 T 中寻找子串 p。主串 T 又被称为文本串,子串 p 又被称为模式串(Pattern)。
4.1 单模式串匹配问题
4.2 多模式串匹配问题
五、学习地址
注:由datawhale提供学习
参考资料
【书籍】数据结构(C 语言版)- 严蔚敏 著
【书籍】大话数据结构 - 程杰 著
【书籍】数据结构教程(第 3 版)唐发根 著
【书籍】数据结构与算法 Python 语言描述 - 裘宗燕 著
【书籍】柔性字符串匹配 - 中科院计算所网络信息安全研究组 译
【博文】字符串和编码 - 廖雪峰的官方网站
【文章】数组和字符串 - LeetBook - 力扣
【文章】字符串部分简介 - OI Wiki
【文章】解密 Python 中字符串的底层实现,以及相关操作 - 古明地盆 - 博客园