字符串模式匹配(朴素模式匹配算法与KMP算法)
文章目录什么是字符串的模式匹配两种模式匹配算法第一种朴素模式匹配算法BF方式一定位操作的方式实现方式二数组下标实现朴素模式匹配算法时间复杂度第二种KMP算法朴素模式匹配的优化求next数组预处理模式匹配时间复杂度求模式串的next数组手算练习next数组的优化nextval数组手算练习什么是字符串的模式匹配在主串 N 中查找 M 子串。NM 主串的长度可能远大于子串的长度两种模式匹配算法字符串模式匹配在主串中找到与模式串相同的子串并返回其(第一个元素)所在位置。子串是主串的一部分一定存在于主串中模式串不一定能在主串中找到。第一种朴素模式匹配算法BF主串长度为n模式串长度为m。朴素模式匹配算法将主串中所有长度为m的子串最多对比n-m1个子串依次与模式串对比直到找到一个完全匹配的子串(返回其第一个元素的位置位序)或将所有的子串都不匹配为止。算法思想“枚举所有可能的位置逐一尝试匹配。”主串长度为n模式串长度为m。算法从主串的第1个字符开始截取长度为m的子串与T比较。若匹配则返回当前位置若不匹配则从主串的下一个位置重新开始比较。直到主串剩余长度不足m则匹配失败返回0。方式一定位操作的方式实现// 定位操作intIndex(SString S,SString T){// S为主串T为子串inti1;intnS.length,mT.length;// 获取串的长度SString Sub;// 用于暂存子串// 最多对比 n-m1个子串while(in-m1){// 边界条件剩余长度必须 m// 取出从位置i开始长度为m的子串SubString(Sub,S,i,m);// 调用已实现的求子串 取出长度为m的子串// 子串和模式串对比若不匹配则匹配下一个子串if(StrCompare(Sub,T)0){returni;// 匹配成功}i;// 不匹配则往后移动一位继续查找}return0;// 未找到 S中不存在与T相等的子串}方式二数组下标实现朴素模式匹配算法不使用字符串的基本操作直接通过数组下标实现朴素模式匹配算法。intIndex(SString S,SString T){inti1,j1;// i 遍历主串S j 遍历子串T// 当iS.length则结束循环while(iS.lengthjT.length){if(S.ch[i]T.ch[j]){// 1. 匹配成功指针后移继续匹配i;j;}else{// 2. 匹配失败i 回溯j 重置ii-j2;// 核心回溯公式j1;}}if(jT.length)// 3. 子串全部匹配完returni-T.length;// 返回起始位置elsereturn0;}时间复杂度设主串长度为n模式串长度为m则最坏的时间复杂度为O(nm).第二种KMP算法朴素模式匹配的优化利用 不匹配的字符之前前面的这些元素一定是和模式串一致的可以直接选择从下一个不同的地方开始匹配。** i (主串指针)不动即主串指针i不用回溯j变化**求next数组预处理根据模式串T求出next数组。next数组之和模式串有关与主串无关。// 求模式串 T 的 next 数组位序从1开始voidget_next(SString T,intnext[]){inti1,j0;next[1]0;// 1. next[0] 无脑写0while(iT.length){// 注意i 从1遍历到 length-1因为 next[length] 需要在循环内求if(j0||T.ch[i]T.ch[j]){// 2. 匹配或退无可退i;j;next[i]j;// 3. 记录当前 i 位置的 next 值}else{jnext[j];// 4. 回溯 j利用已求得的 next 数组}}}模式匹配利用next数组进行匹配主串指针不回溯// KMP 匹配算法主串 S模式串 T已求好的 next 数组intIndex_KMP(SString S,SString T,intnext[]){inti1,j1;while(iS.lengthjT.length){// 1. 若 j0表示第一个字符都不匹配i 必须后移一位// 2. 若当前字符匹配继续比较下一对if(j0||S.ch[i]T.ch[j]){i;j;}else{// 3. 失配i 不动j 回溯到 next[j]jnext[j];}}if(jT.length)returni-T.length;// 匹配成功elsereturn0;}时间复杂度KMP算法最坏时间复杂度O(mn)其中预处理求next数组时间复杂度O(m)模式匹配模式匹配过程最坏时间复杂度O(n)求模式串的next数组手算练习next[1]都无脑写0next[2]都无脑写1其他next在不匹配的位置前划一刀分界线模式串一步一步往后退向右走直到分界线之前左边都“能对上”或模式串完全跨过分界线为止。此时j 指向哪儿则next数组值就是多少。next数组的优化nextval数组手算练习// 求优化后的 nextval 数组voidget_nextval(SString T,intnextval[]){inti1,j0;nextval[1]0;while(iT.length){if(j0||T.ch[i]T.ch[j]){i;j;// 核心优化若 i 和 j 位置的字符相等则继续递归if(T.ch[i]!T.ch[j]){nextval[i]j;// 不同直接赋值}else{nextval[i]nextval[j];// 相同用 nextval 覆盖}}else{jnextval[j];// 回溯时也用 nextval}}}手算解题先求next数组再由next数组求nextval数组。nextval[1]0;// 从next[2]开始for(intj2;jT.length;j){if(T.ch[next[j]]T.ch[j])nextval[j]nextval[next[j]];// 优化部分elsenextval[j]next[j];}

相关新闻

LLM驱动教育游戏开发:动态内容生成与智能体架构实战

LLM驱动教育游戏开发:动态内容生成与智能体架构实战

在教育技术领域,大型语言模型(LLM)与教育游戏的结合正在开辟新的可能性。这种融合不仅仅是简单地将问答功能嵌入游戏,而是通过LLM的动态内容生成、个性化交互和情境理解能力,创造出能够适应学生水平、提供即时反馈并持…

2026/10/19 6:04:07 阅读更多 →
3个关键步骤:使用OpCore-Simplify快速配置黑苹果系统

3个关键步骤:使用OpCore-Simplify快速配置黑苹果系统

3个关键步骤:使用OpCore-Simplify快速配置黑苹果系统 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于想要在非苹果硬件上运行macOS的用…

2026/10/19 6:04:23 阅读更多 →
英雄联盟智能助手Seraphine:告别繁琐查询,开启数据驱动的游戏新时代

英雄联盟智能助手Seraphine:告别繁琐查询,开启数据驱动的游戏新时代

英雄联盟智能助手Seraphine:告别繁琐查询,开启数据驱动的游戏新时代 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 你是否曾在英雄联盟对局开始前,手忙脚乱地打开多个网页…

2026/10/15 17:47:33 阅读更多 →

最新新闻

diagram-design:构建可维护图表设计系统的核心方法论

diagram-design:构建可维护图表设计系统的核心方法论

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次看到 diagram-design 这个词,很多人会下意识觉得它只是“画图”的另一种说法。但真正在项目里被图表折磨过的人会明白,画图本身从来不是难点,难的是让图在三个月…

2026/10/19 6:03:37 阅读更多 →
artcraft框架:从创意到实物的完整工作流拆解

artcraft框架:从创意到实物的完整工作流拆解

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的第一反应是:这大概率不是一个单纯的绘画工具,也不是一个纯粹的手工教程合集。把“art”和“craft”拼在一起,本身…

2026/10/19 6:03:37 阅读更多 →
工业指针仪表识别系统:抗油污低光倾斜的Python全流程方案

工业指针仪表识别系统:抗油污低光倾斜的Python全流程方案

简介:本资源是一份面向工业智能化巡检场景的Python图像识别系统设计论文,适用于自动化、仪器仪表、计算机视觉方向的本科生、研究生及现场工程师,解决指针式模拟仪表人工读数效率低、无人巡检落地难的核心痛点。论文提出基于DeepLabV3语义分割…

2026/10/19 6:03:37 阅读更多 →
从防御规避到加密流量检测:AES-256-GCM下的安全运营实战

从防御规避到加密流量检测:AES-256-GCM下的安全运营实战

之前和一些同行聊“免杀”这个话题,大家的反应往往两极分化:有人觉得它神秘,有人觉得它就是恶意软件对抗杀毒的手段,没什么好聊的。我自己的看法其实不同——在安全运营和检测工程这个视角里,“免杀”并不是一个孤立的…

2026/10/19 6:03:37 阅读更多 →
昆仑通态触摸屏与台达温控器Modbus RTU联调:寄存器映射与报警批量配置

昆仑通态触摸屏与台达温控器Modbus RTU联调:寄存器映射与报警批量配置

1. 联调前必须捋清楚:接线、通信参数与485总线的坑1.1 最小系统怎么搭:从硬件接线开始做项目这些年,最怕的不是工艺逻辑复杂,而是上位机和仪表的“通信语言”对不上。前阵子接手一套加热设备改造,现场是25台台达DT330温…

2026/10/19 6:03:37 阅读更多 →
React 18并发渲染实战:自动批处理、startTransition与Suspense优化搜索筛选页

React 18并发渲染实战:自动批处理、startTransition与Suspense优化搜索筛选页

前段时间我接手一个搜索筛选页的重构,数据量不算夸张,两千多条记录、六七个筛选条件,但旧实现里每敲一个字,键盘都明显发沉。页面后来变流畅,靠的就是React 18的并发渲染能力,重点落在Suspense、Transition…

2026/10/19 6:02:37 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →