由零个或多个字符组成的有限序列,又名字符串
s 是串的名称
用双引号 或 单引号 括起来的字符序列 是 串的值
字符数目n 是串的长度
空串:0个字符的串,长度为0——> s = ""
空格串:——> s = " "
子串:串中任意个数的连续字符组成的子序列称为该串的子串
包含子串的串称为主串
串的比较
s1 = "abcd",s2 = "acbd"
第一个字母都是a,认为不存在大小差异
第二个字母中”b“在字母表中靠前于”c“,认为”b“ < "c",于是 s1 < s2
字符集:如ASCII 码,Unicode
两个串相等——> 长度 + 各个位置的字符都相等
两个串不等时:
1.s1 = "hap"
s2 = "happy" ——> 则 s1 < s2
2.s1 = "abcd"
s2 = "acbd"——> 则 s1 < s2
串的抽象数据类型
串的逻辑结构和线性表类似,但,串针对的是字符集,也就是串中的元素都是字符
线性表 更关注的是单个元素的操作 【比如插入、删除】
串 更多的是查找子串位置、得到指定位置子串、替换子串
# 不同的高级语言,对串的基本操作有不同的定义方法
串的存储结构
1.顺序存储结构
用一组地址连续的存储单元存储串中的字符序列
按照预定义的大小,为每个定义的串变量 分配一个 固定长度的存储区 【定长数组】
既然定长,必然有 预定义的最大串长度
一般可以将实际的串长度值保存在数组的 0 下标位置
也可以在串值后面加一个不计入串长度的结束标记字符 如 “\0” 【此时 遍历计算即可得串的长度】
但,由于串的操作,可能会超出 MaxSize,于是,对于串的顺序存储,有了一些变化,串值的存储空间可在程序的执行中 动态分配
2.链式存储结构
一个结点存多少字符,直接影响串处理的效率 【根据实际情况选择】
#除了 连接串与串操作方便外,灵活度和性能都比不上顺序存储
朴素的模式匹配算法
串的模式匹配:子串的定位操作
最好情况——> 一开始就匹配成功 时间复杂度O(1)
稍差一些——> 每次首字母直接不匹配,省去对子串的循环 时间复杂度为O(n【主串长】+m【要匹配的子串长】)
由等概率原则,平均(n + m ) / 2次 时间复杂度O(n+m)
最坏情况——> 每次不成功的匹配发生在子串最后一个
到了第41个位置,全部匹配相等,不需要再继续下去
如果没有可匹配的子串【比如是0....002】,到了第41位不匹配,后面同样不需要继续比
期间进行了( 50 - 10 + 1) * 10 次判断
时间复杂度为 O((n-m+1)*m)
太低效!!!!
KMP模式匹配算法
1.原理
P.163
2.next数组值推导
P.167
3.KMP模式匹配算法实现
KMP模式匹配算法改进
170
nextval数组值推导
172
【标页码的部分,计划打印了细看,有总结的话,会更新这篇博客,需要pdf的可以私信~】