字符串模式匹配(朴素模式匹配算法与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/7/27 19:12:05 阅读更多 →
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/7/27 19:12:05 阅读更多 →
英雄联盟智能助手Seraphine:告别繁琐查询,开启数据驱动的游戏新时代

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

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

2026/7/27 19:12:05 阅读更多 →

最新新闻

国家中小学智慧教育平台电子课本下载终极指南:tchMaterial-parser完全教程

国家中小学智慧教育平台电子课本下载终极指南:tchMaterial-parser完全教程

国家中小学智慧教育平台电子课本下载终极指南:tchMaterial-parser完全教程 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课…

2026/7/27 19:23:09 阅读更多 →
Next.js+Prisma+PostgreSQL开发实战:数据库设计与API接口开发

Next.js+Prisma+PostgreSQL开发实战:数据库设计与API接口开发

Next.jsPrismaPostgreSQL开发实战:数据库设计与API接口开发 【免费下载链接】nextjs-prisma-boilerplate Full stack boilerplate with Next.js, Prisma, Tailwind, TypeScript, Docker, Postgres, documentation, frontend and backend unit and integration tests…

2026/7/27 19:23:09 阅读更多 →
api2go与数据库集成:如何设计高效的存储层实现

api2go与数据库集成:如何设计高效的存储层实现

api2go与数据库集成:如何设计高效的存储层实现 【免费下载链接】api2go JSONAPI.org Implementation for Go 项目地址: https://gitcode.com/gh_mirrors/ap/api2go api2go是一个Go语言实现的JSONAPI.org规范框架,它提供了构建符合JSON API标准的R…

2026/7/27 19:23:09 阅读更多 →
3种方法用Dataflow kit实现无限滚动页面爬取,效率提升10倍

3种方法用Dataflow kit实现无限滚动页面爬取,效率提升10倍

3种方法用Dataflow kit实现无限滚动页面爬取,效率提升10倍 【免费下载链接】dataflowkit Extract structured data from web sites. Web sites scraping. 项目地址: https://gitcode.com/gh_mirrors/da/dataflowkit Dataflow kit是一款强大的网页数据提取工…

2026/7/27 19:23:09 阅读更多 →
【可灵文生视频实战指南】:零基础到日更爆款,7天掌握AI视频生成核心工作流

【可灵文生视频实战指南】:零基础到日更爆款,7天掌握AI视频生成核心工作流

更多请点击: https://kaifayun.com 第一章:可灵文生视频工具概览与环境准备 可灵(Kling)是由昆仑万维推出的AI原生视频生成工具,支持从文本描述直接生成高质量、高时长(最长可达2分钟)、高一致…

2026/7/27 19:23:09 阅读更多 →
Maka Agent未来路线图:探索即将推出的7大令人期待的AI助手新功能

Maka Agent未来路线图:探索即将推出的7大令人期待的AI助手新功能

Maka Agent未来路线图:探索即将推出的7大令人期待的AI助手新功能 【免费下载链接】maka-agent Maka — local-first AI desktop assistant 项目地址: https://gitcode.com/gh_mirrors/mak/maka-agent Maka Agent作为一款local-first的AI桌面助手,…

2026/7/27 19:22:09 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻