串的基本概念

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. 将模式串依次与主串的第 1, 2, 3, …, n-m+1 个位置对齐
  2. 每次对齐后,从模式串的第一个字符开始逐个比较
  3. 一旦某个字符不匹配,主串指针 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 算法的核心优化思路:

  1. 主串指针永不回退:已比较过的字符绝不重新比较
  2. 利用 next 数组:通过模式串自身的结构信息(最长相等前后缀),确定失配后模式串的滑动位置
  3. 预处理算力换匹配时间: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 的实现方式(概念题)

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

串的基本概念
https://lingluoa.icu/posts/string-basics/
作者
lingluoa
发布于
2026-07-05
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
lingluoa
Hello, I'm lingluoa.
公告
欢迎来到我的博客!不定期更新中。
文章目录
标签
站点统计
文章
53
分类
9
标签
75
总字数
175,771
运行时长
0
最后活动
0 天前
站点信息
构建平台
ESA Pages
博客版本
Firefly v6.15.6
文章许可
CC BY-NC-SA 4.0