定义
串的数据对象限定为字符集
存储结构
- 定长顺序存储
#define MaxLen 255 // 定义最大串长
typedef struct{
char ch[MaxLen];
int length; // 串的实际长度
}SString;
- 堆分配存储
typedef struct{
char *ch; // 按串长分配存储区
int length; // 串的长度
}HString;
串的模式匹配
模式匹配:求子串在主串中的位置,子串也叫模式串
简单模式匹配:逐个字符去与主串匹配
主串、子串长度n、m,时间复杂度为O(nm)
改进——KMP算法
主串不会回溯,匹配失败后从上一次结束点继续
模式串则从next处开始
时间复杂度为O(m+n)
主串位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
模式串 | a | b | a | a | b | c | a | c |
next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
nextval[j] | 0 | 1 | 0 | 2 | 1 | 3 | 0 | 2 |
推荐B站这个视频,https://www.bilibili.com/video/BV1it411r7ZD/
关于next数组的手动计算,推荐去观看网上的视频
首先解释一下:
next[j]就是模式串中,前缀和后缀相等时对应前缀/后缀的最大长度
n
e
x
t
[
j
]
=
{
0
模
式
串
首
位
置
M
A
X
从
首
字
符
开
始
的
前
缀
与
尾
字
符
结
束
的
后
缀
的
最
大
相
等
长
度
1
前
后
缀
不
相
等
next[j]=\left\{ \begin{array}{rcl} 0 & & 模式串首位置\\ MAX & & 从首字符开始的前缀与尾字符结束的后缀的最大相等长度\\ 1 & & 前后缀不相等 \end{array} \right.
next[j]=⎩⎨⎧0MAX1模式串首位置从首字符开始的前缀与尾字符结束的后缀的最大相等长度前后缀不相等
所谓前缀(后缀),就是主串去掉第一个字符(最后一个字符)所剩所有子串。
小狼的相关博文: