【考纲内容】字符串模式匹配
【重点】KMP算法,next数组与nextval数组
串的基本概念
串(String)是由零个或多个字符组成的有限序列,是一种特殊的线性表。串的逻辑结构与线性表类似,区别在于串的数据对象限定为字符集。
重要术语:
- 长度:串中字符的个数(空串长度为0)。
- 子串:串中任意个连续字符组成的子序列。
- 主串:包含子串的串。
- 位置:字符在串中的序号(从1开始)。
串的存储结构
1. 定长顺序存储
用一组连续的存储单元存储字符,长度固定(超出部分截断)。
cs
#define MAXLEN 255
typedef struct {
char ch[MAXLEN];
int length;
} SString;
2. 堆分配存储
动态分配内存空间,长度可变。
cs
typedef struct {
char *ch;
int length;
} HString;
3. 块链存储
用链表存储串的字符,每个结点可存多个字符(如块大小为4)。
cs
typedef struct Chunk {
char ch[4];
struct Chunk *next;
} Chunk;
typedef struct {
Chunk *head, *tail;
int length;
} LString;
串的基本操作
赋值操作
将串T的值赋给串S(需保证S有足够空间)。
比较操作
按字典序比较两个串的大小(如"abc" < "acd")。
求子串
从主串的指定位置截取指定长度的子串。
连接操作
将串S1和串S2拼接为新串(如"Hello" + "World" = "HelloWorld")。
模式匹配
在主串中查找子串的位置(经典算法:朴素匹配、KMP算法)。
模式匹配算法
朴素匹配(Brute-Force)
逐个字符比较,失败时主串回溯到起始位置的下一位。
时间复杂度:O(n*m)(n为主串长度,m为子串长度)。
KMP算法
利用部分匹配表(next数组)避免主串回溯。
- next数组:记录子串前缀与后缀的最长公共长度。
- 时间复杂度:O(n+m)。
示例:子串"ababc"的next数组为[0, 0, 1, 2, 0]。
串的应用
- 文本编辑:查找、替换、插入等操作。
- 搜索引擎:关键词匹配。
- 生物信息学:DNA序列比对。
通过理解串的存储结构和核心操作,可以高效处理文本相关任务。