发布时间:2026/7/12 23:02:12
一文读懂:通俗易懂的KMP算法详解
我们先提出一个问题给你两个字符串 s 和 pp 的长度不超过 s 的长度且 s 和 p 都不是空的问 s 中是否包含 p例如s“hello, java”, p “java”那么 s 包含 ps“github”, p“ppt”, s 不包含 p能否写出一个程序高效地解决这个问题。我们能容易想到这样的方法设置两个指针i 和 j都初始化为 0我们对比 s 在 i 位置p 在 j 位置的字符。如果 s[i] p[j]那么 i 和 j 都移到下一个位置。否则 j 回退到 0i 回退到 1继续上述过程如果在下一次比较中还是出现了不匹配的字符那么 j 回退到 0i 回退到 2继续……周而复始。直到某一次匹配中如果 j 到达越界位置那么 s 包含 p否则 s 不包含 p。代码如下public class StrContains { public static boolean contains(String s, String p) { int ls s.length(), lp p.length(), i 0, j 0; while(i ls - lp) { int x i; j 0; while(j lp s.charAt(x) p.charAt(j)) { x; j; } if(j lp) return true; i; } return false; } }这样的查找方法在遇到 s “aaaaaaaaaaaaab”p “aab” 这样的情况的时候会使得 p 只有在最后一次匹配的时候才可以得到匹配。假设 s 的长度是 Np 的长度是 M那么显然的最坏情况下时间复杂度就是 O(N∗M)。而 KMP 算法能做到最坏情况下 O(NM) 的时间复杂度。它是怎么做的呢我们一起来看看吧。KMP 算法的计算过程启发的过程上面的暴力方法是基于这样的一个尝试的思路如果 s 中有一个子串和 p 是匹配的因为任何一个子串都有一个开头位置那么这个和 p 匹配的子串当然也有一个开头位置又因为我们不知道哪个开头位置的子串和 p 是匹配的因此我们尝试所有可能的开头。如果我们尝试完所有的开头位置都没有发现一个子串可以和 p 匹配那么 s 中就没有一个子串和匹配即 s 不包含 p反之 s 包含 p。那么这个过程它为什么低效呢我们来看一下 s “aaaaaaaaab” 和 p “aaab” 的匹配过程。当我们发现某一个开头的尝试已经宣告失败的时候此时只能选择下一个开头继续从头开始匹配。那么此时指向 s 的指针会回退之前已经匹配的部分结果完全抛弃从新开始因此这个方法是低效的。如果某一次尝试失败了那么之前已经匹配的部分之前做过的努力能否给我们提供一些帮助加速我们的匹配过程甚至能使得字符串 s 上的指针不回退呢我们调整的时候需要遵循什么原则呢为了便于说明 j 的调整下面我们举一个明显的例子。请看字符串 s “acacab”和字符串 p “acab” 的匹配过程。那么如果已经匹配的部分有多个前缀和后缀是匹配的呢我们怎么选择请看 s “aaaab” 和 p “aaab” 的匹配过程。总结一下此时我们似乎找到了保证 s 指针不回退的时候p 的指针的调整方案即当我们发现某一次匹配失败的时候我们需要找出前面已经匹配部分的 前后缀最大匹配长度假设为 next那么我们只需要把 j 调整为 next继续进行匹配操作即可。next 数组我们在进行真正的匹配之前我们要先计算好每一个元素的 next 值next 值的含义就是当前元素失去匹配的时候它前面部分字符串的前后缀最大匹配长度这个前后缀不包含自己看下面对字符串 “caccacb” 的 next 值的定义过程

相关新闻

Metadata Extraction Leveraging Large Language Models
2026/7/12 23:02:12

Metadata Extraction Leveraging Large Language Models

文章主要内容与创新点总结 一、主要内容 该研究聚焦于利用大型语言模型(LLMs)优化合同元数据提取任务,针对法律及企业场景中文档审查效率低、成本高的问题,构建了一套完整的元数据提取流水线。核心流程包含三大关键模块: 文本转换与OCR预处理:将PDF等非结构化文档转换为…

阅读更多
如何用KLayout免费开源版图设计工具实现芯片设计全流程:从入门到验证的完整指南
2026/7/12 23:02:12

如何用KLayout免费开源版图设计工具实现芯片设计全流程:从入门到验证的完整指南

如何用KLayout免费开源版图设计工具实现芯片设计全流程:从入门到验证的完整指南 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout 你是否正在寻找一款功能强大且完全免费的EDA工具来开启芯片设计之旅&am…

阅读更多
第一篇文档:邮局信使大揭秘 ——System V 消息队列内核原理与原生 API 全解
2026/7/12 22:02:12

第一篇文档:邮局信使大揭秘 ——System V 消息队列内核原理与原生 API 全解

一、趣味开篇类比(秒懂消息队列)我们把 System V 消息队列 比作小区公共邮局信箱:消息队列 一整个公共信箱柜Key 信箱唯一编号,所有进程通过编号找到这个柜子消息类型 mtype 信件分类标签(1 号文件、2 号通知、3 号…

阅读更多
Multi-Token Prediction (MTP) 多 Token 预测技术深度解析:从训练信号增强到推理加速的全链路剖析
2026/7/13 0:02:12

Multi-Token Prediction (MTP) 多 Token 预测技术深度解析:从训练信号增强到推理加速的全链路剖析

Multi-Token Prediction (MTP) 多 Token 预测技术深度解析:从训练信号增强到推理加速的全链路剖析 核心痛点:大语言模型自回归解码逐 Token 生成导致推理延迟高,单 Token 预测训练信号稀疏致使模型规划能力不足 适配人群:大模型训练与推理工程师、AI 基础设施开发者、推理框…

阅读更多
AI Agent自动订单处理,真能替代人工审核?2024 Q2真实压测数据曝光:99.992%准确率背后的11个隐性依赖
2026/7/13 0:02:12

AI Agent自动订单处理,真能替代人工审核?2024 Q2真实压测数据曝光:99.992%准确率背后的11个隐性依赖

更多请点击: https://codechina.net 第一章:AI Agent自动订单处理,真能替代人工审核?2024 Q2真实压测数据曝光:99.992%准确率背后的11个隐性依赖 在2024年第二季度,某头部电商平台对自研AI Agent订单处理系…

阅读更多
浦东旧模块回收哪家强?专业评测带你一探究竟
2026/7/13 0:02:12

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

阅读更多
Cocos Creator游戏接入抖音小游戏侧边栏复访功能全流程指南
2026/7/13 0:02:12

Cocos Creator游戏接入抖音小游戏侧边栏复访功能全流程指南

1. 项目概述与核心价值 最近在对接抖音小游戏平台时,侧边栏复访功能成了一个绕不开的“必答题”。很多开发者朋友,包括我自己一开始,都对这个功能有点摸不着头脑:它到底是什么?为什么平台这么重视?不接入行…

阅读更多
UE5 Niagara火焰特效性能优化实战:从GPU负载到移动端适配
2026/7/13 0:02:12

UE5 Niagara火焰特效性能优化实战:从GPU负载到移动端适配

1. 项目概述:当火焰特效成为帧率杀手在UE5项目里,尤其是那些追求电影级视觉的开放世界或者大场景战斗游戏,一个熊熊燃烧的篝火、一次震撼的爆炸,往往是点燃玩家情绪的关键。Niagara作为虚幻引擎5中取代了老旧的Cascade的下一代粒子…

阅读更多
如何使用Nokhwa快速实现跨平台摄像头捕获功能:面向开发者的完整指南
2026/7/12 23:02:12

如何使用Nokhwa快速实现跨平台摄像头捕获功能:面向开发者的完整指南

如何使用Nokhwa快速实现跨平台摄像头捕获功能:面向开发者的完整指南 【免费下载链接】nokhwa Cross Platform Rust Library for Powerful Webcam/Camera Capture 项目地址: https://gitcode.com/gh_mirrors/no/nokhwa 想要在Rust项目中轻松实现跨平台摄像头捕…

阅读更多
智慧树刷课插件:5分钟实现自动化学习的智能助手
2026/7/12 0:01:57

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

阅读更多
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案
2026/7/12 0:01:57

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

阅读更多
办公自动化实战:5个免费工具构建合同处理流水线
2026/7/12 0:01:57

办公自动化实战:5个免费工具构建合同处理流水线

1. 这不是“又一个工具包”,而是一套经过237次真实场景验证的效率组合拳“2026.04.28实用教程工具分享”这个标题乍看平平无奇,像极了你邮箱里被自动归入“促销/订阅”文件夹的那类通知——但如果你真把它当普通更新忽略,接下来半年里&#x…

阅读更多
UE5 Niagara火焰特效性能优化实战:从GPU负载到移动端适配
2026/7/13 0:02:12

UE5 Niagara火焰特效性能优化实战:从GPU负载到移动端适配

1. 项目概述:当火焰特效成为帧率杀手在UE5项目里,尤其是那些追求电影级视觉的开放世界或者大场景战斗游戏,一个熊熊燃烧的篝火、一次震撼的爆炸,往往是点燃玩家情绪的关键。Niagara作为虚幻引擎5中取代了老旧的Cascade的下一代粒子…

阅读更多
Cocos Creator游戏接入抖音小游戏侧边栏复访功能全流程指南
2026/7/13 0:02:12

Cocos Creator游戏接入抖音小游戏侧边栏复访功能全流程指南

1. 项目概述与核心价值 最近在对接抖音小游戏平台时,侧边栏复访功能成了一个绕不开的“必答题”。很多开发者朋友,包括我自己一开始,都对这个功能有点摸不着头脑:它到底是什么?为什么平台这么重视?不接入行…

阅读更多
浦东旧模块回收哪家强?专业评测带你一探究竟
2026/7/13 0:02:12

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/11 9:29:01

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/11 9:29:01

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/12 10:22:36

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多