当前位置: 首页 > 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.jsqmd.com/news/905983/

相关文章:

  • Boss直聘批量投递工具:如何将求职效率提升300%?
  • 2026连云港卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • AI 意图识别大揭秘:从“if-else“到“任务结构提取器“,5大演进路径全解析!
  • 2026宁波卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • Windows HEIC缩略图提供程序:让iPhone照片在Windows中“活“起来
  • Taotoken用量看板与成本管理功能的实际使用观感
  • 如何利用iret修改cs ip
  • 2026天津卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 别再手动拖拽了!用Qt的QSplitter实现可拖拽布局,5分钟搞定专业级UI
  • 别再只存.pt了!PyTorch模型转ONNX并用Netron可视化的保姆级避坑指南
  • 2026泰州卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • Java开发实战:构建高效、可维护的Web应用
  • 2026甄选:萃取工艺与分离技术领域专业厂家全景解析 - 品牌企业推荐师(官方)
  • AI大模型人才市场深度解析:三极主导+技能定价,2026年区域竞争与薪酬分化白皮书
  • 电路设计入门:从核心概念到PCB实战的完整指南
  • 从功能堆砌到问题消除:构建用户零困惑产品的设计哲学与实践
  • 2026年 文件夹行业格局分析:活页文件夹/A4办公文件夹/资料文件夹/OEM文件夹/PVC文件夹/学生文件夹/3寸文件夹厂家实力洞察 - 品牌企业推荐师(官方)
  • 别再乱返回数据了!手把手教你用NestJS响应拦截器统一API格式(附RxJS操作符详解)
  • CAXA 样式管理
  • 【C++】零基础入门 · 第 9 节:动态内存管理(new 与 delete)
  • 2026淮安卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 2026年 东莞防水袋厂家推荐排行榜:手机/相机/PVC/TPU/沙滩防水袋品牌优选与高防护耐用 - 品牌企业推荐师(官方)
  • C 语言进阶:联合体与枚举精讲,从原理到实战吃透两大自定义类型
  • 开发者在模型迭代时利用 Taotoken 快速切换并测试新模型
  • 终极指南:如何用免费自动化工具轻松抢到美国签证面试名额
  • 2026莆田卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 前端视角下的 C#
  • 意图共鸣科技《认知智能白皮书》——认知架构(CA):把“价值观”写进独立模块的工程推演
  • 【C++】零基础入门 · 第 10 节:结构体与类
  • 读文献怎么做能节省80%的时间