定义
定义:串(string)是由零个或多个字符组成的有限序列
空串:串的字符数目为零
子串:串中任意个连续的字符组成的子序列
两个串相等:当且仅当这两个串值相等,即两个串的长度相等,并且各个对应位置上的字符都相等
抽象数据类型
1 | ADT String{ |
串的表示和实现
1.定长顺序存储表示
1 |
|
图示:
1.以下标为0的数组分量存放串的实际长度
2.在串值后面加一个不计入串长的结束标记字符
静态存储分配:直接用定长的字符数组来定义
优点:涉及串长的操作速度快,但不适合插入、链接操作
2.对分配存储表示:
1 | typedef struct{ |
动态存储分配:定义串是不分配存储空间,需要使用时按所需串的长度分配存储单元
3.块链存储表示:
1 |
|
图示:
当节点大小大于1时,由于串长不一定是节点大小的整数倍,则链表中的最后一个节点不一定全被串值沾满,此时通常补上“#”或其他的非串值字符
三种存储表示的比较
定长顺序存储
①在串联接和求子串的操作中,操作的时间复杂度基于复制的字符序列的长度
②如果在操作中出现序列长度超过上届MAXSRELEN,约定用结尾法处理,这种情况在联接、插入、置换等都可能发生
堆分配存储表示
①存储空间动态分配
②处理方便,操作对于串长没有任何限制,更显灵活
块链存储
对某些串操作,诸如联接操作等有一定的方便之处,但总的来说不如另外两种存储结构灵活
存储密度
1.存储密度=串值所占的存储位/实际分配的存储位
2.存储密度小,运算处理方便,然而存储占用大
串的模式匹配
子串的定位操作
主串为S,子串为模式T
1.常规匹配算法:
逐字符比较
n是主串长度,m是模式长度
最好时间复杂度O(n+m)
最坏时间复杂度O(n*m)
2.KMP算法:
改进在于:
每当一趟匹配过程中出现字符比较不等时,不需回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较
时间复杂度O(n+m)
3.两种算法比较:
虽然前者时间复杂度是O(n*m),但是一般情况改下,其实际的执行时间近似于O(n+m),因此至今仍被采用
串代码
1 |
|