当前位置: 首页 > news >正文

【算法】小白也能懂 · 第 17 节:KMP 字符串匹配算法

在日常开发中,字符串匹配是最常见的操作之一。比如:在文本中搜索关键词、在 DNA 序列中查找特定片段、在编辑器中使用 Ctrl+F 查找。

KMP 算法(Knuth-Morris-Pratt)是一种高效的字符串匹配算法,它的核心思想是:当匹配失败时,利用已匹配的信息跳过不必要的比较

1. 什么是字符串匹配?

1.1 问题定义

给定一个文本串text和一个模式串pattern,找出patterntext中第一次出现的位置。

示例

  • text ="ABABDABACDABABCABAB"
  • pattern ="ABABCABAB"
  • 结果:位置 9(从 0 开始计数)

1.2 暴力匹配(BF 算法)

最直观的方法是暴力匹配:逐个字符比较,失败就回退。

intbruteForce(conststring&text,conststring&pattern){intn=text.size();intm=pattern.size();for(inti=0;i<=n-m;i++){intj=0;while(j<m&&text[i+j]==pattern[j]){j++;}if(j==m){returni;// 找到匹配}}return-1;// 未找到}

问题:时间复杂度为 O(n × m),当文本很长时效率极低。

1.3 暴力匹配的问题

文本:A B A B A B C 模式:A B A B C ✓ ✓ ✓ ✓ ✗

匹配到第 5 个字符时失败,暴力算法会回退到文本的第 2 个字符重新开始:

文本:A B A B A B C 模式: A B A B C ✗

但其实我们已经知道前 4 个字符是ABAB,完全可以利用这个信息跳过一些不必要的比较。

2. KMP 算法的核心思想

2.1 关键观察

KMP 的核心思想是:当匹配失败时,模式串不需要回退到开头,而是根据已匹配的部分跳到合适的位置继续匹配

文本:A B A B A B C 模式:A B A B C ↑ 失败点 已知:模式串前 4 个字符是 ABAB 问题:ABAB 的哪个后缀等于它的前缀? 答案:AB(长度为 2) 所以:模式串可以直接跳到位置 2 继续匹配

2.2 next 数组(部分匹配表)

为了实现这个跳转,KMP 算法预处理模式串,计算一个next 数组(也叫部分匹配表 PMT)。

next[j]的含义:模式串中,以j结尾的子串的最长相等前后缀长度

示例:模式串ABABCABAB

j子串最长相等前后缀next[j]
0A0
1AB0
2ABAA1
3ABABAB2
4ABABC0
5ABABCAA1
6ABABCABAB2
7ABABCABAABA3
8ABABCABABABAB4

2.3 如何使用 next 数组

text[i]pattern[j]不匹配时:

  • 如果j > 0,将j跳转到next[j-1]
  • 如果j == 0,只移动文本指针i
intkmpSearch(conststring&text,conststring&pattern){intn=text.size();intm=pattern.size();if(m==0)return0;// 计算 next 数组vector<int>next=computeNext(pattern);inti=0;// 文本指针intj=0;// 模式指针while(i<n){if(text[i]==pattern[j]){i++;j++;if(j==m){returni-j;// 找到匹配}}elseif(j>0){j=next[j-1];// 跳转}else{i
http://www.rkmt.cn/news/1417286.html

相关文章:

  • AI 意图识别大揭秘:从“if-else“到“任务结构提取器“,5大演进路径全解析!
  • Windows HEIC缩略图提供程序:让iPhone照片在Windows中“活“起来
  • 2026天津卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 别再乱返回数据了!手把手教你用NestJS响应拦截器统一API格式(附RxJS操作符详解)
  • 开发者在模型迭代时利用 Taotoken 快速切换并测试新模型
  • 【C++】零基础入门 · 第 10 节:结构体与类
  • 2026莆田卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 为什么你的Ubuntu没有/proc/config.gz?深入解读CONFIG_IKCONFIG编译选项与发行版策略
  • 如何通过QMCDecode实现QQ音乐格式自由转换:打破平台限制的技术方案
  • 2026宿迁卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 162、运动控制中的仿真:模型降阶与实时仿真
  • Win10资源管理器导航窗格太乱?教你一键删除3D对象、视频等多余文件夹(附注册表脚本)
  • 163、运动控制中的测试:阶跃响应与频率响应
  • 2026年品牌互联网营销服务商Top5能力最新评测 - GEO优化
  • Python 开发者三步接入 Taotoken 调用 Claude 与 GPT 模型
  • 别再死记硬背了!用Python写个语法检查器,帮你搞定非谓语动词(附代码)
  • Chiplet 架构嵌入式设计:异构计算平台搭建与性能调优实战
  • 边缘 AI 轻量化部署实战:TinyML 在 STM32H5 上的模型压缩与实时推理优化
  • 紫檀红木黄花梨回收,京顺斋上门服务,专业估值,诚信变现 - 深鉴新闻
  • 终极指南:如何免费解锁Wand专业版功能的完整教程
  • 基于Arduino与PID控制的智能循迹机器人设计与实现
  • 使用Taotoken CLI工具一键配置多开发环境下的模型调用密钥
  • 什么是OPC(一人公司)?
  • 从游戏资源解构到创意重构:Harepacker复活版的现代游戏编辑哲学
  • 基于CentOS7.9部署LAMP(二)基于域名的虚拟主机配置wordpress和discuz
  • ctf show web入门259
  • 数据库基础概述
  • 对比使用前后Taotoken如何让我的模型API账单变得清晰易懂
  • 2025-2026 AI全媒体营销服务商选型 - 资讯快报
  • 卖工业空压机怎么找客户?下游工厂在哪里