Skip to main content

Documentation Index

Fetch the complete documentation index at: https://0907.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

本章重点复习字符串这一特殊的线性表除了掌握串的几种存储结构及其空间利用率差异外,最核心的考点和难点在于模式匹配算法,尤其是 KMP 算法中 nextnextval 数组的求解和应用

串的存储结构

定长顺序存储
  • 存储方式:用连续存储单元(数组)依次存放字符
  • 特点
    • 随机访问方便:可 O(1)O(1) 取第 ii 个字符
    • 需要预先给出 MaxSize,可能出现空间浪费或溢出
  • 常见实现:额外记录 length(串长),便于快速求长度
  • 存储方式:用链表结点存放字符并用指针连接
  • 特点
    • 插入/删除在局部位置更灵活(不必整体移动)
    • 存储密度低(指针域开销),随机访问不便(取第 ii 个字符需 O(i)O(i) 遍历)

模式匹配

  • 思想:从主串某一位置开始,逐字符与模式串比较;一旦失配,主串起始位置后移一位,模式串从头再比
  • 时间复杂度(设主串长度 nn,模式串长度 mm):
    • 最好情况:一次就匹配成功,约 O(m)O(m)
    • 最坏情况:大量“前缀相同、末尾失配”,时间复杂度约 O(nm)O(nm)
      价值:实现简单,是理解 KMP 算法的参照物
设主串 S、模式串 T,当比较到 S[i]T[j] 时失配:
  • BF:主串起始位置后移 1 位,然后把 T 从头开始对齐再比(主串下标会回退)
  • KMP主串指针 i 不回退,只调整模式串指针 j(把 T 向右“滑动”到一个必然不会错过答案的位置)
本质:KMP 利用 T 的“自相似性”(前缀 = 后缀)来复用已经比对过的结果
前缀、后缀、最长相等真前后缀 (LPS)
  • 前缀:串的从左开始的若干字符(可取空)
  • 后缀:串的从右开始的若干字符(可取空)
  • 真前缀/真后缀:不等于串本身的前缀/后缀
  • LPS (Longest Proper Prefix which is also Suffix):最长相等真前后缀长度例如 X = "ababab",其 LPS 长度为 4(“abab”)
nextval(进一步减少“必然再次失配”的比较)
  • 现象:若 T[j]==T[next[j]]T[j] == T[next[j]],则把 jj 跳到 next[j]next[j] 后,下一次比较依然会拿同样字符去比,容易产生无效比较
  • 优化思想:若按 next[j]next[j] 回退后仍会拿“相同字符”去比较,则可继续回退以跳过这类必然失败的比较
  • 复习建议:先把 nextnext 与 KMP 主流程写熟,再在题目强调“减少比较次数/优化”时引入 nextvalnextval
时间复杂度:为什么是 O(n+m)O(n+m)
  • 构造 next/nextvalO(m)O(m)
  • 匹配过程:O(n)O(n)
    直观原因:匹配过程中,主串指针 ii 单调递增不回退,总共最多走 nn
Last modified on May 14, 2026