本文来源于《数据结构考研复习指导》,仅做笔记记录用。
文章目录
串的定义和实现
字符串简称串,计算机上非数值处理的对象基本都是字符串数据。
串的定义
串(string)是由零个或多个字符组成的有限序列,一般记为
S = ′ a 1 a 2 . . . a n ′ ( n ≥ 0 ) S='a_1a_2...a_n' (n\geq0) S=′a1a2...an′(n≥0)
其中:
- S是串名
- 单引号括起来的字符序列是串的值
- ai可以是字母、数字或其他字符
- 串中字符个数n称为串的长度
- n=0时的串称为空串
子串
串中任意连续的字符组成的子序列称为子串,包含子串的串称为主串。某个字符在串中的序号称为该字符在串中的位置。
串相等
当两个串的长度相等,且每个对应位置的字符都相等时,称这两个串是相等的。
空格串
由一个或多个空格(空格是特殊字符)组成的串称为空格串。(空格串不是空串)其长度为串中空格字符从数量。
串的存储结构
定长顺序存储表示
在串的定长顺序存储结构中,为每个串变量分配一个固定长度的存储区,即定长数组。
#define MAXLEN 255 // 预定义最大串长为255
typedef struct {
char ch[MAXLEN]; // 每个分量存储一个字符
int length; // 串的实际长度
} SString;
串的实际长度只能小于等于MAXLEN,超过预定长度的串值会被舍去,称为截断。
串长的表示方式
- 用一个额外的变量len来存放串的长度
- 在串值后面加入一个不计入串长的结束标记字符"\0",此时的串长为隐含值
堆分配存储表示
堆分配存储表示仍然以一组地址连续的存储单元存放串值的字符序列,但它们的存储空间是程序执行过程中动态分配得到的。
typedef struct {
char *ch; // 按串长分配存储区,ch指向串的基地址
int length; // 串的长度
} HString;
在C语言中,存在一个称为“堆”的自由存储区,并用malloc()和free()函数来完成动态存储管理。利用malloc()为每个新产生的串分配一块实际串长需要的存储空间,若分配成功,则返回一个指向起始地点的指针,作为串的基地址,这个串由ch指针来指示;若分配失败,则返回NULL。已分配的空间可以用free()释放。
块链存储表示
类似于线性表的链式存储结构,也可以采用链表方式存储串值。由于串的特殊性(每个元素只有一个字符),再具体实现时,每个结点既可以存放一个字符,也可以存放多个字符。每个结点称为块,整个链表称为块链结构。
串的基本操作
- StrAssign(&T, chars)
赋值操作。把串T赋值为chars。 - StrCopy(&T, S)
复制操作。由串S复制得到串T。 - StrEmpty(S)
判空操作。若S为空串,则返回TRUE,否则返回FLASE。 - StrCompare(S, T)
比较操作。若S>T,则返回>0;若S=T,则返回值=0;若S<T,则返回值<0。 - StrLength(S)
求串长。返回串S的元素个数。 - SubString(&Sub, S, pos, len)
求子串。用Sub返回串S的第pos个字符起长度为len的子串。 - Concat(&T, S1, S2)
串联接。用T返回由S1和S2联接而成的新串。 - Index(S, T)
定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置;否则函数值为0。 - ClearString(&S)
清空操作。将S清为空串。 - DestroyString(&S)
销毁串。将串S销毁。
串的模式匹配
子串的定位操作通常称为串的模式匹配,它求的是子串(常称为模式串)在主串中的位置。
简单的模式匹配算法
这里采用定长顺序存储结构,给出一种不依赖其他串的暴力匹配算法。
int Index(SString S, SString T) {
int i = 1, j = 1;
while (i <= S.length && j <= T.length) {
if (S.ch[i] == T.ch[j]) {
++i; ++j; // 继续比较后续字符
}
else {
i = i - j + 2; j = 1; // 指针后退重新开始匹配
}
}
if (j > T.length) return i - T.length;
else return 0;
}
时间复杂度为O(nm),其中n和m为主串和模式串的长度。
KMP算法
字符串的前缀、后缀和部分匹配值
前缀
前缀指除最后一个字符串外,字符串的所有头部子串。
后缀
后缀指除第一个字符外,字符串的所有尾部子串。
部分匹配值
部分匹配值为字符串的前缀和后缀的最长相等前后缀长度。
以‘ababa’为例:
子串 | 前缀 | 后缀 | 最长相等前后缀 | 最长相等前后缀长度 |
---|---|---|---|---|
a | 0 | |||
ab | a | b | {a}∩{b}=∅ | 0 |
aba | a,ab | a, |