串的基本概念
1521 字
8 分钟
串的基本概念
Warning
含AI生成内容
串的基本概念
串的定义
串(String)是由零个或多个字符组成的有限序列,记为:
S = 'a₁a₂...aₙ'其中 n 称为串的长度。串是 线性表 的一种特殊形式——其数据元素被限定为字符。但与线性表的主要操作(增删改查单个元素)不同,串的核心操作是子串定位(模式匹配),这也是串在 408 考研中的核心考点。
核心术语
| 术语 | 定义 | 示例(S = ‘abcabc’) |
|---|---|---|
| 子串 | 串中任意个连续字符组成的子序列 | ’abc’、‘bca’、‘a’ |
| 主串 | 包含子串的串 | S 是 ‘abc’ 的主串 |
| 空串 | 长度为 0 的串 | "" |
| 空格串 | 由空格字符组成的串 | ’ ‘(长度为 3) |
| 串相等 | 长度相同且对应位置字符相同 | ’abc’ = ‘abc’ |
| 子串位置 | 子串第一个字符在主串中的位序 | ’bca’ 在 S 中的位置是 2 |
空串 vs 空格串(经典陷阱):空串长度为 0,不包含任何字符;空格串由空格字符组成,长度即空格个数。两者完全不同。例如
""是空串," "(三个空格)是长度为 3 的空格串。这是 408 选择题的常见陷阱。
子串个数计算
长度为 n 的串:
- 非空子串个数:n(n+1)/2(长度为 1 的有 n 个,长度为 2 的有 n-1 个,…,长度为 n 的有 1 个)
- 含空串的子串总数:n(n+1)/2 + 1
注意:相同内容的子串出现在不同位置视为不同的子串。例如串 ‘aaa’ 中,子串 ‘a’ 出现 3 次,都算不同的子串。
基本操作集
| 操作 | 说明 |
|---|---|
| StrAssign(&T, chars) | 赋值,将字符串常量 chars 赋给 T |
| StrCopy(&T, S) | 复制,将 S 复制到 T |
| StrEmpty(S) | 判空,S 为空串返回 true |
| StrLength(S) | 求串长,返回 S 的字符个数 |
| StrCompare(S, T) | 比较,S > T 返回正值,相等返回 0,S < T 返回负值 |
| SubString(&Sub, S, pos, len) | 求子串,从 pos 位置取长度为 len 的子串 |
| Concat(&T, S1, S2) | 串联接,将 S1 和 S2 拼接成 T |
| Index(S, T, pos) | 定位(模式匹配),从 pos 开始找子串 T 在主串 S 中的位置 |
其中 Index 操作就是模式匹配问题——在 408 考研中,算法实现层面的核心考点。两种经典算法是 BF算法 和 KMP 算法。
三种存储结构
| 存储方式 | 实现 | 特点 |
|---|---|---|
| 定长顺序存储 | 用静态数组 char str[MaxLen] | 长度固定,超出则截断 |
| 堆分配存储 | 用 malloc 动态分配 | 长度可变,C 语言的标准实现 |
| 块链存储 | 用链表,每个结点存多个字符 | 存储密度低,实际很少使用 |
408 考研中串的存储结构较少单独出题,但需注意:
- 定长顺序存储中,串长有两种记录方式:下标 0 位置存长度 或 用 ‘\0’ 标记结尾
- KMP 算法实现中,下标从 0 开始还是从 1 开始会影响 next 数组的值,做题时务必看清题目约定
BF 算法(朴素模式匹配)
核心思想
BF(Brute Force)算法是字符串匹配的暴力解法,其核心思路是穷举所有对齐位置:
- 将模式串依次与主串的第 1, 2, 3, …, n-m+1 个位置对齐
- 每次对齐后,从模式串的第一个字符开始逐个比较
- 一旦某个字符不匹配,主串指针 i 回退,模式串指针 j 归零,从下一个对齐位置重新开始
主串 S: a b a b c a b c a c模式 T: a b c ↑ 第1次对齐算法流程
// BF 算法(下标从 1 开始)int BF(char S[], char T[], int n, int m) { int i = 1, j = 1; while (i <= n && j <= m) { if (S[i] == T[j]) { i++; j++; } else { i = i - j + 2; // i 回退到本次对齐起点的下一位 j = 1; // j 归零 } } if (j > m) return i - m; return 0;}失配时的回溯公式 i = i - j + 2 是代码填空常考点。
复杂度分析
| 情况 | 时间复杂度 | 说明 |
|---|---|---|
| 最好情况 | O(n+m) | 第一趟就匹配成功,或每趟第一个字符就失败 |
| 最坏情况 | O(nm) | 每趟比较到模式串最后一个字符才失败 |
| 最坏比较次数 | (n-m+1) x m | 例如 S=“aaa…ab”,T=“aaa…b” |
BF 的缺陷
BF 算法的根本缺陷是丢弃了已匹配信息:当匹配到第 j 个字符失配时,主串中的前 j-1 个字符已经比较过了,但 i 的回退导致这些信息全部作废。主串指针来回波动是 BF 低效的根源。
例如:
第1趟: S: a b a b c ... 匹配到第3个字符失败 T: a b c ↑ 失败第2趟: S: a b a b c ... i 回退到2重新开始 T: a b c ↑ 回退到这里(实际上 b≠a 显然不可能匹配)第 2 趟的比较完全是多余的——从已匹配信息可知 S[2]=b 不可能匹配 T[1]=a。这正是 KMP 算法 要解决的问题。
KMP 算法的引出动机
KMP 算法的核心优化思路:
- 主串指针永不回退:已比较过的字符绝不重新比较
- 利用 next 数组:通过模式串自身的结构信息(最长相等前后缀),确定失配后模式串的滑动位置
- 预处理算力换匹配时间:O(m) 的预处理代价换来 O(n) 的匹配效率
详细内容见 KMP 算法。
考研高频考点
- 空串 vs 空格串的概念辨析(选择题)
- 子串个数计算:n(n+1)/2 + 1(含空串)(选择题)
- BF 算法失配时 i 的回退公式
i = i - j + 2(代码填空) - BF 算法最坏时间复杂度 O(nm) 及最坏比较次数 (n-m+1) x m(选择题/填空题)
- BF 与 KMP 对比:BF 回溯主串指针,KMP 不回溯(简答题必考)
- 三种存储结构的区别与适用场景(概念题)
- 串的基本操作 Index 的实现方式(概念题)
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
图的基本概念与存储结构
数据结构2026-07-07
2
KMP 算法
数据结构2026-07-07
3
图的遍历
数据结构2026-07-07
4
特殊矩阵的压缩存储
数据结构2026-07-06
5
二叉树的遍历与线索化
数据结构2026-07-06
随机文章随机推荐










