讲解KMP算法

字符串匹配KMP算法讲解 假设我们解决这样一个问题: 有字符串S与模式串P,想知道模式串P在字符串S的什么位置,应如何解决? 解决子串匹配问题 字符串S:“abcabcabd” 模式串P:“abcabd” 采用暴力(Brute Force)算法,即朴素算法的做法: 依次比较每个字符,直到串的每个字符都一一吻合。 算法执行流程:朴素算法中,一旦匹配不成功,要到目标串下一位,再和模式串从头匹配,流程相对繁琐。很明显,例子中的2与3步骤是可以省略的,关键在于,能否保存两个串中,相同部分的字符,每次移动模式串时,直接忽略其中字符不相同 阅读详情

KMP算法是一种用于字符串匹配的高效算法,它的全称是Knuth-Morris-Pratt算法,由Donald Knuth、James Morris和Vaughan Pratt在1977年提出。KMP算法的目标是在一个文本串S中查找一个模式串P的出现位置。

KMP算法的核心思想是利用已经匹配过的部分信息来避免不必要的匹配,从而提高匹配的效率。为了达到这个目的,KMP算法引入了一个部分匹配表(也称为失配函数),用于记录模式串中的每个位置之前的子串的最长公共前缀和最长公共后缀的长度。

下面具体介绍KMP算法的流程:

  1. 预处理部分匹配表(失配函数):从模式串P的第二个字符开始,逐个字符计算前缀和后缀的最长公共部分,并记录在部分匹配表中。部分匹配表的长度与模式串P的长度相同。

  2. 在文本串S中查找模式串P:从文本串的第一个字符开始,逐个字符与模式串的字符比较。如果当前字符匹配成功,则比较下一个字符;如果当前字符匹配失败,则根据部分匹配表中的信息,移动模式串,使模式串的第一个字符与当前字符对齐。

具体来说,匹配过程如下:

  • 如果文本串S的当前字符与模式串P的当前字符匹配,即S[i] = P[j],则将i和j分别加1,继续比较下一个字符。
  • 如果当前字符匹配失败,即S[i] != P[j],根据部分匹配表,找到模式串需要移动的位置k,则将j移动到k的位置,继续比较当前字符和模式串的字符。
  • 如果模式串的第一个字符与当前字符匹配失败,则将i加1,继续比较下一个字符。

KMP算法的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。这是因为在文本串中每个字符都最多和模式串中的字符比较一次,并且根据部分匹配表移动模式串的位置。

总结起来,KMP算法通过预处理部分匹配表,在匹配过程中利用这些信息来避免不必要的匹配,从而大大提高了字符串匹配的效率。

从爱好者到工程师:如何低成本体验RFSoC ZU47DR?性能实测与避坑指南 本文详细介绍了如何低成本体验赛灵思RFSoC ZU47DR芯片,包括二手开发板选购、租赁服务、精简开发环境搭建等实用方案。通过性能实测与避坑指南,帮助爱好者和工程师在有限预算下充分利用这款集成了ARM处理器和FPGA的高性能芯片,降低开发门槛。 阅读详情

相关推荐

GD32单片机开发环境搭建(Keil5安装)

1.安装MDK5 由于GD32 Keil 版本例程的工程是基于Keil MDK-ARM 5.25 uVision5 创建的,所以我在此也安装MDK5.25版本。 下载链接:https://pan.baidu.com/s/1E4tcDQvsVl0xezU3pEyJTA 提取码:s1fr 其他版本下载链接:https://cloud.tencent.com/developer/article/1605195 选择安装路径(不要装到中文路径下,避免不必要的麻烦): 用户信息随便...

fangye945a的博客 3万+

KMP算法——小白讲解

温馨提示:本片文章只是我的学习笔记,看了一些相关视频和其他博主的文章,做出的总结,还有一些是我自己的一些理解,可能写得乱七八糟,还请见谅。深入的理解可能这篇文章是讲不到的,觉得不合适的同学请另寻解答,当然也欢迎您的浏览 KMP算法是朴素的匹配算法BF算法的升级版。 BF算法的时间复杂是O(n * m),KMP算法的时间复杂度是O(n+m)。 其改进在于:每当一趟匹配过程中出现字符比较不等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式串向右“滑动”尽可能远的一段距后,继续进行比较。课本原话

叶子的小本本 337

三角洲自动购买工具 —— 基于 OCR 的价格识别与自动点击

通过的方式,我们可以轻松实现自动化的“价格监控 + 自动点击”工具。它的优势在于通用性—— 只要能截屏识别价格,就能用于任何程序,不依赖特定 API。未来可以扩展的功能:自动保存配置到文件。支持多价格区域检测。增加快捷键启停功能。

qq_62975494的博客 2417

kmp算法讲解 java

kmp算法本质上就是一个字符串匹配的算法。它的作用与java中String类的indexOf方法是一样的,就是返回一个字符串(以下简称N串)在另一个字符串(以下简称M串)中的位置,只不过在复杂度上进行了一些优化。 暴力匹配算法 简单来说,就是通过双重循环来遍历所有情况,以进行匹配。 相信所有正在学习kmp算法的人早已掌握这种方法了,我也不再多说,只给出一种解法以供参考。 public class ...

nayi_224的博客 715

Apple 网页 SRP 登录系列文章(四):Hashcash 工作量证明与完整登录流程

本文是Apple SRP登录系列文章的收官之作,重点解析了Apple独有的Hashcash工作量证明机制并展示了完整的登录流程实现。文章详细介绍了Hashcash的安全目的、格式标准、计算核心算法及难度评估方法,特别提供了Python实现代码。同时还讲解了如何动态获取服务器Hashcash参数以及建立容错机制。最后呈现了完整的Apple SRP登录主函数架构,为开发者提供了从理论到实践的全面指导。全文通过代码示例和流程分析,系统性地阐述了Apple安全登录机制的技术细节。

Sayid_Des的专栏 628

FairyGUI深度解析:Unity复杂UI开发的高效解决方案与性能优化

在Unity游戏和应用开发中,UI系统的性能与开发效率是核心挑战。原生UGUI的组件化模型在应对复杂、动态界面时,常面临Draw Call过高、层级管理臃肿的问题。其原理在于,每个UI元素对应一个GameObject,渲染合批受限于Transform层级与材质状态,易导致性能瓶颈。FairyGUI(FGUI)作为一种专业的第三方UI解决方案,其技术价值在于采用了截然不同的“舞台-显示对象”渲染模型。该模型通过内部轻量级对象管理与自主合批系统,实现了极高的运行时效率与Draw Call优化。在应用场景上,FG

weixin_31315567的博客 339

KMP算法讲解与实现

KMP算法的讲解与实现

明朗晨光的专栏 1971

ArcMap安装与配置全攻略:从下载到实战应用

本文提供了ArcMap 10.4.1从系统准备、详细安装到破解激活的完整指南,并包含首次启动的界面介绍与一个实战GIS分析项目。针对初学者,文章强调了在ArcGIS Pro成为趋势的当下,学习经典ArcMap对于理解核心概念和兼容现有工作流仍有重要价值,帮助用户避开安装常见陷阱,快速上手实战应用。

weixin_29200741的博客 335

史上最透彻的KMP算法讲解

作 者:柳行刚 编 辑:李文臣 1 字符串匹配是经典的KMP算法。下面以字符串"BBC ABCDAB ABCDABCDABDE"为例,查找是否包含串"ABCDABD"? 图一 2      首先如上图,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜词"ABCDABD"的第一个字符,B与A不相等,所以后移动。 图二

燕哥带你学算法 3202

集群路径规划实战(一)之EGO-swarm环境搭建与调试

本文详细介绍了EGO-swarm分布式无人机集群运动规划系统的仿真环境搭建与调试全流程。内容涵盖ROS Melodic安装、代码获取、依赖库配置、编译问题解决(如multi_map_server头文件缺失)以及最终通过roslaunch启动集群仿真与Rviz可视化,为学习和研究集群路径规划算法提供了可运行的实战平台。

weixin_29243279的博客 249

2026年数据中心运行与管理专业人才培养基地建设方案(高职、数据中心运行与管理新专业、人才培养、专业代码:510310)

摘要: 为响应国家“东数西算”战略和数字经济需求,我校拟联合行业领军企业建设数据中心运行与管理人才培养基地。项目基于国家政策引导和产业快速发展背景,针对行业10万人才缺口,对标教育部新设专业标准(510310),分三阶段实施五年规划:专业奠基(2026-2028)、内涵深化(2028-2029)、辐射引领(2030-2031)。建设内容涵盖校企协同岗位能力分析、模块化课程开发(如网络管理、自动化运维等)、实训基地搭建及“课证融通”培养模式,重点培养基础设施、网络服务、运维托管三类岗位技能人才,目标建成区域性

啊碧根果的博客 1684

kmp算法讲解

kmp算法本身,解决的是判断模板字符串T是否是字符串s的子串的问题。 当只需判断子串首次出现的位置,或是否包含子串。可以用库函数strstr(s,t )代替,判断t是否为s的子串来代替。该函数的返回值是t首次出现的位置,如果t不是s的子串则返回NULL。该函数的复杂度与kmp类似。 kmp算法

AI_xue 621

CodeQL查询时遇到报错:A fatal error occurred: Could not process query metadata for...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1083

KMP算法的详细讲解

KMP算法 KMP算法是一种改进的字符串匹配算法。 讲述KMP算法之前,我们要先建立一个概念,没有这个概念,KMP很难理解。 那,我们先忘掉原问题,来进行一个概念建设。这个概念就是:在一个字符串中,一个字符之前的字符串最长前缀和最长后缀的匹配长度,有点绕,我们举个例子吧: 对于字符d,我们想求一个信息,就是d之前的字符串最长前缀和最长后缀的匹配,同时我们要加一个限定:前缀不能包含最后一个字符,...

xiazhiyou 1462

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

KMP 算法注释讲解

【代码】KMP 算法注释讲解。

qq_41684699的博客 183

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

KMP算法详细讲解(超详细配图讲解,小白也可以听懂)

1024程序员节|征文#前言:本篇博会讲解学习KMP算法中遇到的痛难点问题(如:next数组的定义、如何求解next数组、回溯时为什么要回溯到next[i]、前缀和后缀的概念和求解过程等等),这也是我在学习中遇到的困惑点,由此写下本篇博客,希望对大家有所帮助。老规矩,先由列题来引入知识点。题目:给定一个字符串 S,以及一个模式串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串 P 在字符串 S 中多次作为子串出现。求出模式串 P 在字符串 S 中所有出现的位置的起始下标。

2301_77160836的博客 4548

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

KMP算法通俗讲解以及Java实现

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出,所以被称为看毛片算法(我可不知道毛片是什么东西)。 其核心思想就是利用模式串的局部对称,在每一次匹配失败后,达到一种玄幻的跳跃,极大加快匹配速度。玄幻如下: (注:上串为主串,下串为模式串) 当主串与模式串匹配到i=j=4时,发现不匹配,KMP算法下发生了恐怖事件,匹配状态直接变为下图。 ...

whason的博客 1715

KMP 算法及其本质详细讲解

tips: KMP其实本质并不复杂,我尽量用最简单的语句表达; 另外,本人特别喜欢另一种更年轻高效字符串匹配算法——Sunday算法,感兴趣的可以前往查看该参考博文: https://blog.youkuaiyun.com/q547550831/article/details/51860017 KMP作用: char *str = &amp;amp;quot;bacbababadababacambabacaddababacasdsd...

小白tree的博客 1447

KMP算法你真的懂了吗?详细讲解KMP算法,理解每一个细节

文章目录1. 前言2. KMP算法2.1 KMP算法介绍2.1.1 Why exit KMP2.1.2 KMP的思想3.1.3 KMP部分代码2.1.4 求next数组2.2 KMP算法的实现代码2.3 改进的KMP算法2.4 小结 1. 前言 本文中我使用的串方式如下图所示: 文中的串我都记为s s[0]不存放字符,从s[1]开始存放字符。 i表达指向主串的指针,j表示指向模式串的指针。 2. KMP算法 2.1 KMP算法介绍 2.1.1 Why exit KMP 传统的BF算法有一个缺点: 当

渐渐的忘记,赶不上明天(读研ing,2024年毕业) 1374

kmp算法next计算方法_彻底搞懂KMP算法!!(配视频讲解)

KMP确实有点难理解本篇文章,将以如下顺序来讲解KMP,什么是KMPKMP可以解决什么问题什么是前缀表为什么一定要用前缀表如何计算前缀表前缀表与next数组使用next数组来匹配时间复杂度分析构造next数组使用next数组来做匹配()前缀表统一减一 C++代码实现前缀表(不减一)C++实现总结 读完本篇可以顺便,把leetcode上28.实现strStr()题目做了。如果文字实在看不下去,就看我...

weixin_39811193的博客 1万+

KMP算法入门讲解

字符串匹配问题。假设文本是一个长度为$n$的字符串$T$,模板是一个长度为$m$的字符串$P$,且$m\leq n$。需要求出模板在文本中的所有匹配点$i$,即满足$T[i]=P[0],T[I+1]=P[1],...,T[m-1]=P[m-1]$的非负整数$i$(注意字符串下标从0开始)。如图所示,$P$在$T$中有且只有一个匹配点,即位置3。 最朴素的方法是依次判...

dianshu1593的博客 174

左神讲解基础算法--kmp算法

主要解决问题:包含问题。 例如: str1: abc123def str2:123d str1中是否包含有str2这个字串。(注意字串与子序列区别) 子序列:可以连续也可以不连续 子数组/子串:必须是连续的。 好了废话不多说了,我们上正菜。首先,想了解kmp的加速过程,要先知道一个数组叫next数组,这个数组中存放了str2中每个字符的前缀和后缀相匹配的最长...

baheleichizi73654的博客 420

KMP算法详细讲解

KMP的详细讲解,以及对k=next[k]的分析

m0_62044244的博客 470

KMP算法讲解

首先KMP算法使用来匹配字符串的。 而且时间复杂度为O(M+N) M,N分别为两个字符串的长度。 时间复杂度这么低,是怎么做到的呢? 算是用空间换时间的算法。匹配的子串中,若有重复的字段,下一个匹配可以重复使用,避免重头开始匹配。 我们可以参考图片理解: 我们在暴力算法中,挨个匹配,如果匹配失败了,从头开始,如上图逐步匹配示意的那样,那么时间复杂度为O(M*N)。 但我们发现子串中,前四个字符,每两个一组,两组字符相同,所以当第五个字符匹配失败的时候,我们不必从头开始,而可以像上图跳跃匹配.

这是书生呀 653

[数据结构与算法基础] KMP算法讲解

KMP算法是一种高效的字符串匹配算法,由Knuth、Morris和Pratt三位计算机科学家于1977年提出。KMP算法通过在匹配过程中利用已部分匹配的信息来避免不必要的字符比较,从而显著提高了字符串匹配的效率。我们把模式串PPP中各个位置的jjj值的变化定义为一个数组 next。顾名思义,next数组表示jjj值的下一跳(下一步回退到哪儿)的值。对于长度为jjj,从1开始计数的字符串而言,第kkk个位置是从头数第kkk个字符,第j−kj-kj−k是从结尾数第kkk。

m0_65426912的博客 1061

2020年最全最简单KMP算法讲解

1.KMP算法的来源 2.最大公共前后缀 3.KMP算法原理 4.next数组 5.next数组值的确定 6.KMP算法的缺陷 7.KMP算法的改进 8.一道KMP算法题 1.KMP算法的来源 其实博主刚看KMP算法的时候的反应是这样的: 我们引用一个问题 给定一个主串S及一个模式串P,判断模式串是否为主串的子串;若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0;如S=“abcd”,P=“bcd”,则返回2;S=“abcd”,P=“acb”,返回0 这道题我们最先想到的算.

记录博主学到的点滴 1万+
上一篇: 讲解朴素字符串匹配算法
下一篇: 讲解Boyer-Moore算法
懒人刘
博客等级 码龄4年 541粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值