一、串的基本概念
- 空串:长度为 0 的串,不包含任何字符,记作
""。 - 空格串:由一个或多个空格组成的串,如
" "(三个空格),其长度等于空格个数,空格是有效字符。 - 子串与主串:子串是主串中连续的一段字符序列。例如主串
"abcde"的子串有"ab"、"bcd"等;空串是任意串的子串。子串的位置以它第一个字符在主串中的位置表示(通常从1开始计位)。 - 串相等:两个串相等当且仅当它们的长度相同,并且对应位置上的字符完全相同。
- 串比较:基于字符的 ASCII 码值进行字典序比较。从左到右逐位比较,若某位字符不同,则ASCII大的串更大;如果一个串是另一个的前缀,则较长的串更大。例如
"abc" < "abcd"。
二、串的基本操作
以下五种操作构成串的最小操作子集,其他操作可由这些组合实现:
- 赋值(StrAssign(s, t)):将串 s 的值复制给串 t。
- 连接(Concat(s, t)):将串 t 拼接到串 s 后面,生成一个新的连接串。
- 求长(StrLength(s)):返回串 s 中字符的个数。
- 比较(StrCompare(s, t)):按字典序比较两串:
- 返回 -1 表示 s < t;
- 返回 0 表示 s = t;
- 返回 1 表示 s > t。
- 求子串(SubString(s, start, len)):从串 s 的第 start 个字符起,截取长度为 len 的子串。若范围越界则返回空串或报错。
三、串的存储结构
- 顺序存储:使用固定或动态分配的字符数组存储串,特点是访问速度快,但插入删除效率低。
- 静态分配:如
char str[MaxSize]; - 动态分配:运行时根据需要申请空间,灵活性更高。
- 静态分配:如
- 链式存储:采用链表方式存储,每个节点可存放一个或多个字符。
- 节点存单个字符:处理简单,但指针开销大,存储密度低;
- 节点多字符:提高存储密度,减少指针数量,但可能造成结点内空间浪费(最后一个结点不满)。
四、串的模式匹配
- 定义:在主串(目标串)中查找是否存在与模式串(子串)相等的子序列,返回首次匹配成功的位置(通常从1开始)。
- 应用广泛:文本编辑、搜索引擎、DNA序列分析等。
- 常见算法包括:
- BF算法(Brute Force):暴力匹配,逐位比较,最坏时间复杂度 O(m×n)。
- KMP算法:利用已匹配信息避免回溯主串指针,预处理模式串得到 next 数组,时间复杂度 O(m+n),效率显著提升。
- 串的插入操作是指:将一个字符串
t插入到主串s的第pos个字符位置处,形成一个新的串。我们可以使用串的 五种基本操作(赋值、连接、求长、比较、求子串)来实现该功能。
实现思路:
假设要在串 s 的第 pos 个位置插入串 t,步骤如下:
- 求出原串
s的长度n = StrLength(s); - 若
pos < 1或pos > n + 1,则插入位置非法,返回错误或空串; - 使用
SubString(s, 1, pos-1)提取s中从开头到pos-1的前缀部分; - 使用
SubString(s, pos, n-pos+1)提取s中从pos开始到最后的后缀部分; - 将三部分按顺序连接:前缀 +
t+ 后缀; - 最终结果即为插入后的串。
伪代码实现:
String InsertString(String s, int pos, String t)
{
if (pos < 1 || pos > StrLength(s) + 1)
return ""; // 非法位置,返回空串
int n = StrLength(s);
String prefix, suffix, result;
// 获取前缀:1 到 pos-1
if (pos == 1)
prefix = ""; // 插入在最前面
else
prefix = SubString(s, 1, pos - 1);
// 获取后缀:pos 到末尾
if (pos <= n)
suffix = SubString(s, pos, n - pos + 1);
else
suffix = ""; // 插入在末尾之后
// 连接三部分:prefix + t + suffix
result = Concat(prefix, t);
result = Concat(result, suffix);
return result;
}
示例:
设主串 s = "abcde",要将 t = "xyz" 插入到位置 pos = 3 处:
- 前缀:
SubString("abcde", 1, 2) = "ab" - 插入串:
"xyz" - 后缀:
SubString("abcde", 3, 3) = "cde" - 结果:
"ab" + "xyz" + "cde" = "abxyzcde"
时间复杂度分析:
- 求子串和连接操作通常涉及字符复制,时间复杂度为 O(n + m),其中 n 是主串长度,m 是插入串长度。
- 整体时间复杂度为 O(n + m),空间上需要额外存储中间子串。
✅ 注意:此方法完全基于串的最小操作子集实现,无需底层存储细节,适用于抽象数据类型层面的设计。


1746

被折叠的 条评论
为什么被折叠?



