news 2026/5/12 2:18:45

数据结构:(三)字符串——从暴力匹配到 KMP 的跨越

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构:(三)字符串——从暴力匹配到 KMP 的跨越

一、 串的存储结构:定长 vs 堆

串是由零个或多个字符组成的有限序列。在 C 语言中,我们主要关注两种实现:

  1. 定长顺序存储:使用静态数组char str[MAXSIZE]。缺点是长度固定,容易发生截断。

  2. 堆分配存储(重点):使用malloc()动态分配空间。

    typedef struct { char *ch; // 若是非空串,则按串长分配存储区,否则 ch 为 NULL int length; // 串长度 } HString;

二、 模式匹配:寻找子串的艺术

所谓模式匹配,就是在大串(主串 S)中找到小串(模式串 T)出现的位置。

1. BF 算法 (Brute-Force) —— 暴力美学

  • 原理:逐个比对。如果不匹配,主串回溯到上一次起始位置的下一个,模式串从头开始。

  • 缺点:大量回溯,效率低下。时间复杂度为 $

2. KMP 算法 —— 拒绝无用功

KMP 的核心在于:主串指针不回溯,只让模式串向右“滑动”到最合适的位置。

核心黑盒:next数组

next[j]的定义是:当模式串中第个字符与主串失配时,模式串应该退回到哪个位置重新比较。

手算next数组的保姆级步骤:

  1. 第1位next[1] = 0(固定规则)。

  2. 第2位next[2] = 1(固定规则)。

  3. 第 j 位:看第位之前的字符串,寻找“最长相等前后缀”。

    • 例如串ababa

      • 当 $j=4$ 时,前面的串是aba。前缀{a, ab},后缀{ba, a}。最长相等前后缀是a,长度为 1。

      • next[4] = 长度 + 1 = 2


三、 KMP 核心代码深度注释

很多同学看不懂get_next函数,关键在于理解它本质上是一个“模式串自己匹配自己”的过程。

void get_next(String T, int next[]) { i = 1; j = 0; next[1] = 0; while (i < T.length) { if (j == 0 || T.ch[i] == T.ch[j]) { // 如果 j==0 说明要从头开始匹配 // 如果 ch[i] == ch[j] 说明当前字符匹配成功,前后缀长度加 1 ++i; ++j; next[i] = j; } else { // 【深度注释】关键回溯点 // 如果不匹配,j 回退到 next[j] 的位置 // 这种跳跃式回退利用了已有的匹配信息 j = next[j]; } } }

四、 深度复盘:KMP 为什么快?

在 AI 领域或大规模数据检索中,字符串匹配极度频繁。

  • 空间换时间:KMP 预先分析模式串的结构(生成next数组),避免了主串的重复扫描。

  • 流式处理友好:由于主串不回溯,KMP 非常适合处理无法回头读取的数据流。


五、 今日对比总结

特性BF 算法KMP 算法
主串指针 $i$频繁回溯一直向前,不回头
模式串指针 $j$每次失配回到 1回到next[j]
时间复杂度
适用场景短串、简单匹配长串、模式串有大量重复片段时

今日避坑指南:

  1. 索引起点:严版教材中串通常从索引1开始(ch[0]弃用或存长度)。如果你的代码从0开始,next数组的值需要整体偏移。

  2. 优化版 nextval:当模式串出现连续重复字符(如aaaaab)时,普通的next会进行无意义的比较。nextval就是为了跳过这些重复比较。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 10:03:03

Leetcode49:字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat",…

作者头像 李华
网站建设 2026/5/10 23:08:03

Puppeteer MCP

在TRAE中使用Puppeteer MCP&#xff0c;相当于给你的AI编程助手装上了一双可以自动操作浏览器的手。它能把那些需要你手动点击、输入和查看网页的重复性工作&#xff0c;变成一句简单的指令。 &#x1f6e0;️ Puppeteer MCP 能做什么&#xff1f; 简单来说&#xff0c;它让T…

作者头像 李华
网站建设 2026/5/10 23:48:43

Sequential Thinking MCP

在TRAE国际版中&#xff0c;Sequential Thinking是让你与AI协作处理复杂任务的“思维导航仪”。它能把一个笼统的大问题&#xff0c;像拼乐高一样&#xff0c;拆解成一系列清晰、可执行的小步骤&#xff0c;并且边做边想&#xff0c;随时调整。 &#x1f9e0; 核心理解&#x…

作者头像 李华
网站建设 2026/5/10 10:24:02

深度测评 自考必用TOP8一键生成论文工具:高效写作全解析

深度测评 自考必用TOP8一键生成论文工具&#xff1a;高效写作全解析 自考论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着自考人数逐年增长&#xff0c;论文写作成为众多考生必须面对的挑战。从选题构思到内容撰写&#xff0c;再到格式规范与查重处理&am…

作者头像 李华
网站建设 2026/5/10 14:10:42

Agent Skills实战:将AI助手打造成Vercel资深工程师的全栈指南

摘要 在AI编程新时代&#xff0c;Vercel开创性地将十年React/Next.js经验封装成Agent Skills开源知识库。本文深度解析这一技术革命的内部原理&#xff0c;从技能包架构设计到实战工作流构建&#xff0c;全方位指导开发者如何将AI助手训练成具备Vercel资深工程师视角的代码优化…

作者头像 李华
网站建设 2026/5/10 14:00:50

“多鱼”旧物交易平台的设计与实现(11821)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华