转载请注明来源:http://blog.csdn.net/u010194538/article/details/51024357#t5
第 5章串
5.2 串的定义
串(string)是由零个或多个字符组成的有限序列,又名叫字符串。
一般记为s="a1a2......an"(n≥0),其中s是串的名称,用双引号括起来的字符序列是串的值。ai(1≤i≤n)可以是字母、数字或其他字符,i就是该字符在串中的位置。串中的字符数目n称为串的长度。零个字符的串称为空串(nullstring)。
空格串,是只包含空格的串。注意它与空串的区别,空格串是有内容有长度的,而且可以不止一个空格。
子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。
5.3 串的比较
给定两个串:s="a1a2......an",t="b1b2......bm",当满足以下条件之一时,s<t。
1.n<m,且ai=bi(i=1,2,……,n)。
例如当s=“hap”,t=“happy”,就有s<t。因为t比s多出了两个字母。
2.存在某个k≤min(m,n),使得ai=bi(i=1,2,……,k-1),ak<bk。
例如当s="happen",t="happy",因为两串的前4个字母均相同,而两串第5个字母(k值),字母e的ASCII码是101,而字母y的ASCII码是121,显然e<y,所以s<t。
5.4 串的抽象数据类型
串的逻辑结构和线性表很相似,不同之处在于串针对的是字符集,也就是串中的元素都是字符,哪怕串中的字符是“123”这样的数字组成,只能理解为长度为3的字符串。
因此,对于串的基本操作与线性表是有很大差别的。线性表更关注的是单个元素的操作,比如查找一个元素,插入或删除一个元素,但串中更多的是查找子串位置、得到指定位置子串、替换子串等操作。
5.5 串的存储结构
串的存储结构与线性表相同,分为两种。
5.5.1 串的顺序存储结构
串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。一般是用定长数组来定义。
对于串的顺序存储,有一些变化,串值的存储空间可在程序执行过程中动态分配而得。比如在计算机中存在一个自由存储区,叫做“堆”。这个堆可由C语言的动态分配函数malloc()和free()来管理。
5.5.2 串的链式存储结构
对于串的链式存储结构简单的应用链表存储串值,一个结点可以存放一个字符,也可以考虑存放多个字符,最后一个结点若是未被占满时,可以用“#”或其他非串值字符补全。当然,这里一个结点存多少个字符才合适就变得很重要,这会直接影响着串处理的效率,需要根据实际情况做出选择。
但串的链式存储结构除了在连接串与串操作时有一定方便之外,总的来说不如顺序存储灵活,性能也不如顺序存储结构好。
5.7KMP模式匹配算法
子串的定位操作通常称做串的模式匹配。
可以避免朴素模式匹配算法的低效。(避免重复遍历的情况)