串类型的定义
串(或字符串)是由零个或多个字符组成的有限序列,一般记为 s = 'a1a2...an',s为串名。子串在主串中的位置以子串的第一个字符在主串中的位置来表示。
串和表示和实现——定长顺序存储表示
串的顺序存储方式即是在一个字符数组中存放各字符,注意此存储方式并不包含空字符,存储字串的数组的0号单元用来标识字串长度。其存储结构如下图:
//-----串的定长顺序存储表示-----//
#define MAXSTREN 255 //用户可在255以内定义最大串长
typedef unsigned char SString[MAXSTREN +]; //0号单元存放串的长度
堆串
在顺序串中,如果操作中出现串值序列长度超过上界MAXSTRLEN时,约定用截尾法处理,这种情况可能在求联接等中出现。对此,只有不限定串长的最大长度,即动态分配串值的存储空间。
堆串的本质还是顺序存储,只不过内存是动态分配的。由动态分配函数malloc()和free()来管理。利用malloc()为每个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基址,约定串长也作为存储结构的一部分。
堆串是个结构体,char指针指向动态分配的内存来存储字符,length用来存储串的长度。也正是因为需要使用malloc动态分配串的空间,所分配的内存均位于“堆”上,所以这种存储结构被称为“堆串”。
堆串存储结构如下图:
//-----串的堆分配存储表示-----//
typedef struct{
char *ch;
int length;
}HString;
块链串
块链串的本质依然是顺序存储,每个字串用数组接纳,各内存块用指针顺序链接。
块链串的重点在于“块”和“链”。块链串用链表的思维存储字串,但每个结点并不是存储一个字符,还是存储多个字符,不用的“块”之间用指针相“链”。
块链串存储结构如下图:
串的模式匹配算法(KMP)
首先要搞懂最长前缀和最长后缀的概念。"前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。
参考《字符串匹配的KMP算法》
算法讲解参考《KMP算法最浅显理解——一看就明白》