Skip to content

Chapter 04 字符串

1. 基本概念

字符串: 由0或多个字符顺序排列所组成的有限序列,称“串”

串长度:字符串所包含的字符个数

空串:长度为零的串“”;

空格串:“ ”

字符串常数:用一对双撇号“xxxx”作为左右括号,中间字符个数有限, 如“SUNDAY”,“123”,“字符串”等.

为了字符串间比较和运算的便利,字符编码表一般遵循“偏序编码规则”。

字符偏序:根据字符的自然含义,某些字符间两两可以比较次序。大多情况下是字典序.

子串: 若 \(s_2\) 出现在 \(s_1\) 中, 则称 \(s_2\)\(s_1\) 的子串, 或 \(s_1\) 包含 \(s_2\)

真子串: 非空且不为自身的子串

2. 字符串的存储结构与实现

静态存储
- 顺序存储
- C++标准串的运算实现 (即C风格的字符串)

动态存储
- String类的运算实现

2.1 顺序存储

标准字符串:将C++的函数库作为字符串数据类型的方案

采用 char S[M] 的形式定义字符串变量

M 是常量,保持不变

串的结束标记:'\0'

因此, 长度为M的字符串实际最大容量的为(M-1)

Warning

对于两个字符串 char s1[7]="hello", char s2[3]="aa". 不能直接执行 s1=s2 将 s2 复制给 s1, 这是因为 s1, s2 是字符数组的常量指针, 指向数组首地址, 不可被更改. 复制可以使用 strcpy 函数.

3. 字符串模式匹配

用给定的模板P,在目标字符串T中搜索与模板P全相同的一个子串,并返回 P 和 T 匹配的第一个子串的首字符位置

举例:

T=“e==asdk==nje==asdk==”,P=“asdk”

返回1

优化后的 next 数组:

本质上就是如果当前位置失配而要跳转到的位置与当前位置相同, 那么它也一定会失配, 所以可以多跳一步.