第4章 字符串
4.1 字符集 、字符串和字符串操作
字符串可以看做是一类特殊的线性表,表中元素取自选定的字符集(如ASCII字符集或者Unicode字符集)。
4.1.1 字符串的相关概念
与字符串有关的一些主要概念:
- 字符串的长度
- 字符在字符串里的位置
- 字符串相等
- 字典序(读者笔记:完整概念见书上。这里写下我的理解:
就是两个字符串,从左向右看,比较它们下标相同的各对字符,遇到第一对不同字符的字符序,就决定了这两个字符串的顺序。举两个例子吧:
abc < abcd,虽然abc和abcd的前3个字符相同,但后者较长。
abc < add,虽然abc和add两个字符串的长度相同,但后者的第2个字符比前者大。
)
- 字符串拼接:Python语言里加号(+)可以用来表示字符串的拼接。
- 子串关系:(读者笔记:完整解释见书上。)空串是任何一个字符串的子串;任何字符串也是其自身的子串。
- 前缀和后缀是两种特殊子串:
- 其他有用的串运算如:拼接、串替换。
与字符串有关的一些研究
(s1 + s2) + s3 = s1 + (s2 + s3)
4.1.2 字符串抽象数据类型
Python中,字符串定义为一种不变数据类型。下面是一个简单的字符串ADT,其中定义了一些字符串操作:
4.2 字符串的实现
4.2.1 基本实现问题和技术
字符串是字符的线性序列,可以采用线性表的各种实现技术实现,用顺序表或链接表的形式表示。
(读者笔记:书上这里分析的很详细,建议仔细看书。)
4.2.2 实际语言里的字符串
4.2.3 Python的字符串
(读者:书上分析的很详细!!)
4.3 字符串匹配(子串查找)
4.3.1 字符串匹配
应用
- 使用编辑器时,在文本中查找单词或句子,程序里找拼写错误
- 对于Email服务器和客户端的程序的垃圾邮件过滤器
- 谷歌等搜索引擎。。
- 防病毒软件。。
实际的串匹配问题
4.3.2 串匹配和朴素匹配算法
串匹配算法
朴素的串匹配算法
最简单的朴素匹配算法采用最直观可行的策略:
①从左到右逐个字符匹配;
②发现不匹配时,转去考虑目标串里的下一个位置是否与模式串匹配。
(读者:抄代码。。)
def naive_matching(t, p):
m, n = len(p), len(t)
i, j = 0, 0
while i < m and j < n: # i==m说明找到匹配
if p[i] == t[j]: # 字符相同:考虑下一对字符
i, j = i + 1, j + 1
else: # 字符不同!考虑t中下一位置
i, j = 0, j - i + 1
if i == m: # 找到匹配,返回其开始下标
return j - i
return -1 # 无匹配,返回特殊值
(读者笔记:原书中,对朴素的串匹配算法的缺点进行了分析,值得一读。)
4.3.3 无回溯串匹配算法(KMP算法)
(读者笔记:高能预警!!!这个算法比较复杂,不太容易理解!!!)
基本考虑
(读者笔记:好好看书上的分析!!!)
问题分析
(读者笔记:没看懂。。)