*KMP算法**:利用已匹配信息避免回溯主串指针,预处理模式串得到 next 数组,时间复杂度 O(m+n),效率显著提升

一、串的基本概念

  • 空串:长度为 0 的串,不包含任何字符,记作 ""
  • 空格串:由一个或多个空格组成的串,如 " "(三个空格),其长度等于空格个数,空格是有效字符。
  • 子串与主串:子串是主串中连续的一段字符序列。例如主串 "abcde" 的子串有 "ab""bcd" 等;空串是任意串的子串。子串的位置以它第一个字符在主串中的位置表示(通常从1开始计位)。
  • 串相等:两个串相等当且仅当它们的长度相同,并且对应位置上的字符完全相同。
  • 串比较:基于字符的 ASCII 码值进行字典序比较。从左到右逐位比较,若某位字符不同,则ASCII大的串更大;如果一个串是另一个的前缀,则较长的串更大。例如 "abc" < "abcd"

二、串的基本操作
以下五种操作构成串的最小操作子集,其他操作可由这些组合实现:

  1. 赋值(StrAssign(s, t)):将串 s 的值复制给串 t。
  2. 连接(Concat(s, t)):将串 t 拼接到串 s 后面,生成一个新的连接串。
  3. 求长(StrLength(s)):返回串 s 中字符的个数。
  4. 比较(StrCompare(s, t)):按字典序比较两串:
    • 返回 -1 表示 s < t;
    • 返回 0 表示 s = t;
    • 返回 1 表示 s > t。
  5. 求子串(SubString(s, start, len)):从串 s 的第 start 个字符起,截取长度为 len 的子串。若范围越界则返回空串或报错。

三、串的存储结构

  1. 顺序存储:使用固定或动态分配的字符数组存储串,特点是访问速度快,但插入删除效率低。
    • 静态分配:如 char str[MaxSize]
    • 动态分配:运行时根据需要申请空间,灵活性更高。
  2. 链式存储:采用链表方式存储,每个节点可存放一个或多个字符。
    • 节点存单个字符:处理简单,但指针开销大,存储密度低;
    • 节点多字符:提高存储密度,减少指针数量,但可能造成结点内空间浪费(最后一个结点不满)。

四、串的模式匹配

  • 定义:在主串(目标串)中查找是否存在与模式串(子串)相等的子序列,返回首次匹配成功的位置(通常从1开始)。
  • 应用广泛:文本编辑、搜索引擎、DNA序列分析等。
  • 常见算法包括:
    • BF算法(Brute Force):暴力匹配,逐位比较,最坏时间复杂度 O(m×n)。
    • KMP算法:利用已匹配信息避免回溯主串指针,预处理模式串得到 next 数组,时间复杂度 O(m+n),效率显著提升。
    • 串的插入操作是指:将一个字符串 t 插入到主串 s 的第 pos 个字符位置处,形成一个新的串。我们可以使用串的 五种基本操作(赋值、连接、求长、比较、求子串)来实现该功能。

实现思路:

假设要在串 s 的第 pos 个位置插入串 t,步骤如下:

  1. 求出原串 s 的长度 n = StrLength(s)
  2. pos < 1pos > n + 1,则插入位置非法,返回错误或空串;
  3. 使用 SubString(s, 1, pos-1) 提取 s 中从开头到 pos-1 的前缀部分;
  4. 使用 SubString(s, pos, n-pos+1) 提取 s 中从 pos 开始到最后的后缀部分;
  5. 将三部分按顺序连接:前缀 + t + 后缀;
  6. 最终结果即为插入后的串。

伪代码实现:

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),空间上需要额外存储中间子串。

✅ 注意:此方法完全基于串的最小操作子集实现,无需底层存储细节,适用于抽象数据类型层面的设计。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值