1,串的定义
串:由零个或多个字符组成的有序序列。如s = ‘a1a2a3...an’(n>=0)
2,基本概念
- 串的长度:串中字符的数目n;
- 空串:零个字符的串。
- 串的相等:两个串的长度相等,各个对应位置的字符都相等。
- 空格串:有一个或多个组成的串‘ ’。
- 字串:串中任意个连续的字符组成的子序列。
3,串的存储方式
3.1顺序存储
串中的字符被顺序的存储在内存中相邻的存储单元中。
与顺序表类似,顺序串是用一组地址连续的存储单元来存储串中的字符序列。
按其存储分配的不同可将顺序串分为如下两类:
- 静态存储分配的顺序串
- 动态存储分配的顺序串
3.2堆分配存储
仍以一组空间足够大的地址连续的存储单元依次存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的。
3.3串的块链存储
为了便于进行串的操作,当以链表存储串值时,除头指针外还可附加一个尾指针指示链表中的最后一个结点,并给出当前串的长度,称如此定义的串存储结构为块链结构。
3.4字符串常用操作
1,串长函数
int strlen(char *s)
2,串复制
char *strcpy(char *s1,char *s2)
3,串比较
int strcmp(char *s1,char *s2)
4,字符定位 //找c在字符串s中第一次出现的位置
char *strchar(char *s,char c) //若找到,则返回该位置,否则返回NULL
3.5串的模式匹配
设有主串s和字串t,字串t的定位就是要在主串s中找到一个与字串t相等的字串。通常把主串s称为目标串,把字串t称为模式串。
next[0] = -1 意义:任何串的第一个字符的模式值规定为-1.
next[j] = -1 意义:模式串中下标为j的字符,如果与首字符相同,且j的前面1-k个字符与开头的1-k个字符不等。(1<=k<j)
next[j] = k 意义:模式串中下标为j的字符,如果j的前面k个字符与开头的k个字符相等。
KMP算法
KMP算法的时间复杂度为O(n+m)。效率高的主要原因是匹配失败时在主串中不需要回朔,在字串(模式串)中也不一定要回朔到第一个字符的位置。