字符串:零个或多个字符组成的有限序列。
传值:单引号括起来的字符序列。(可以是字母,数字,或其他字符)
串的长度:串中字符的个数,记为n。
空串:n=0时的串。
空串与空格串的区别:空格串是由一个或多个空格组成的串,其长度为空格个数,大于或等于1;空串是无任何字符组成的串,其长度为0。
子串:串中任意个连续字符组成的子序列。
主串:包含子串的串。
求子串:sub(主串,起始位置,长度)。注:起始位置是从0开始数的。例:sub('abcdefg',1,2)='bc'而不是‘ab’
串的模式匹配(模式串在主串中的位置):从主串的起始位置起,模式串在主串中首次出现的位置序号。(注:起始位置不同,模式串在主串中的位置则不同,起始位置可以是0开始,也可以是其他位置做起始位置,是可以随意指定的)
串相等:当且仅当两个串长度相等,且对应位置相等的字符都相等。
串的抽象数据类型定义:数据对象,数据关系,数据操作。
基本操作:串的赋值,串的插入,串的删除,拷贝,比较,判串是否为空,求串的长度,清除串,获取串,复制串,求子串在串中的位置序号,串置换,串消除
串和线性表的区别:串是特定结构的线性表,串只能是字符集,具有一个特定的范围,而线性表还可以是其他数据类型的集合,范围更大。
串的顺序存储结构:顺序串(定长),堆串
定长顺序串基本操作的实现:串插入函数,串删除函数,串复制函数,判空函数,串比较函数,求串长函数,清空函数,连接函数,求子串函数,简单模式匹配函数。
串插入函数:有三种情况,设插入位置P将串分为两部分,分别为LA,LB,还有待插入部分为LC
1.插入后串长<=max length:把B向后移C个位置,再把C插入。
2.插入后串长>max length但P+C<max length:B后移时有部分字符被舍弃。
3.插入后串长>max length但P+C>max length:B的字符全部舍弃,不用后移,C插入时有部分字符被舍弃。
简单模式匹配函数:从主串的某一位置开始,与模式串逐位匹配。(最长时间即时间复杂度为主串长*模式串长)
1.初始化:主串从指定位置开始,模式串从头开始
2.两串逐位比较:当主串、模式串均未遍历完时,对应字符作比较:若相等,主串模式串的当前比较位置均后移;若不相等:主串从开始相等的比较位置的下一个开始,模式串从头开始。
3.判别:若匹配成功返回相等的起始位置,若匹配不成功,返回-1。
上面说的是带回溯的模式匹配算法,可以优化成不带回溯的算法,即为KMP算法,它是模式匹配的一种改进算法,提高了处理速度,在这里不做详细解释。
堆串:系统将一个地址连续、容量很大的存储空间作为字符串的可用空间。每建立新串时,需提供串值的起始位置指针和串长度,系统从堆串区分配空间。
堆串的基本操作:串赋值函数,串插入函数,串删除函数,串复制函数,判空函数,串比较函数,求串长函数,清空函数,连接函数,求子串函数,模式匹配函数。
串的链式存储结构——块链串
单个结点称为块,包括data域和next域两个域。
结点大小为data域存放字符的个数。(在data域中,可以存放单一字符,也可以存放多个字符。结点大小等一1,存储密度较低,处理简单,雷同单链表;结点大小大于1,存储密度较高,管理相对复杂)
链域大小为next域占用字符个数。
块链结构是一个链表,需要头尾指针。
结点为1的块链串的模式匹配:主串和模式串都是链串。
1.初始化:主串从头开始,模式串也是从头开始。
2.两串逐位比较:当主串、模式串均未遍历完时,对应字符作比较:若相等:主串模式串的当前比较位置均后移;若不相等:主串从开始相等的比较位置的下一个位置开始,模式串从头开始。
3.判别:若匹配成功,返回相等的起始位置的指针;若不成功,返回空指针。