news 2026/6/6 10:58:52

KMP 算法详解:next 数组原理 + C++ 实现 + 过程图解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
KMP 算法详解:next 数组原理 + C++ 实现 + 过程图解

KMP 算法详解:next 数组原理 + C++ 实现 + 过程图解

    • 一、为什么需要 KMP
    • 二、next 数组(前缀函数)
    • 三、C++ 参考实现
    • 四、复杂度
    • 五、动画演示

一、为什么需要 KMP

朴素匹配在失配时把模式串后移一位、主串指针回退,最坏 O(nm)。KMP 利用模式串自身的前缀信息,失配时不回退主串指针,达到 O(n+m)。

二、next 数组(前缀函数)

next[i] 表示模式串pattern[0..i]的最长"相等前后缀"长度。失配时,模式串不必从头开始,而是跳到 next 指示的位置继续比较。

三、C++ 参考实现

vector<int>buildNext(conststring&p){intn=p.size();vector<int>nxt(n,0);for(inti=1,j=0;i<n;++i){while(j>0&&p[i]!=p[j])j=nxt[j-1];if(p[i]==p[j])++j;nxt[i]=j;}returnnxt;}intkmp(conststring&s,conststring&p){autonxt=buildNext(p);for(inti=0,j=0;i<(int)s.size();++i){while(j>0&&s[i]!=p[j])j=nxt[j-1];if(s[i]==p[j])++j;if(j==(int)p.size())returni-j+1;}return-1;}

四、复杂度

预处理 next O(m),匹配 O(n),总 O(n+m),空间 O(m)。

五、动画演示

next 数组的"跳转"是 KMP 最难想象的部分。码路星球(我不慌–成长杂货铺,https://wobuhuang.com)的 KMP 可视化把主串、模式串逐字符对齐,匹配/失配变色,next 指引模式串跳转的过程逐帧展示,配代码逐行高亮。看一遍比读三遍文字管用。免费。


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

从单体到分布式:我用Go重构Python后端,性能提升400%的全链路复盘

去年双十一前夕&#xff0c;我接手了一个濒临崩溃的电商促销系统。当时的场景历历在目&#xff1a;Python Django应用运行在8台4核8G的云主机上&#xff0c;CPU常年飙升至90%&#xff0c;接口平均响应时间超过800ms&#xff0c;数据库慢查询堆积如山。大促流量一来&#xff0c;…

作者头像 李华
网站建设 2026/6/6 10:57:39

遗传算法进阶:破解早熟收敛与适应度设计陷阱

1. 项目概述&#xff1a;为什么“遗传算法第二讲”比第一讲更值得你花时间重读“遗传算法”这四个字&#xff0c;十年前在高校课堂里是《人工智能导论》最后一章的冷门配角&#xff0c;五年后成了算法岗面试必问的“经典老题”&#xff0c;而今天——它已经悄悄长进了工业级推荐…

作者头像 李华
网站建设 2026/6/6 10:51:20

遗传算法实操避坑指南:破解早熟、交叉失效与变异僵化

1. 这不是又一篇“遗传算法入门”——它解决的是你调参三天不收敛、种群早熟卡在局部最优、交叉变异像掷骰子的实操困境“遗传算法入门”这个词&#xff0c;我过去十年在技术社区里见过太多次。标题带“Fundamental Introduction”的文章&#xff0c;八成是把选择、交叉、变异三…

作者头像 李华
网站建设 2026/6/6 10:50:43

SketchUp STL插件:打破数字设计与3D打印的最后壁垒

SketchUp STL插件&#xff1a;打破数字设计与3D打印的最后壁垒 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 在3D设计与制造…

作者头像 李华