KMP算法:字符串匹配

字符串匹配算法综述:BF、RK、KMP、BM、Sunday 阅读详情

字符串匹配是一道经典的算法问题,经常出现。例如:
给定主串ss,匹配串pp,返回情况有三种:

  • 匹配成功,返回pp在ss中匹配到的第一个字符串的第一个字符的索引。
  • 匹配失败,主串中不存在与匹配串pp相匹配的子串,返回-1
  • 匹配串为空,返回0

以上就相当于Java中String类的public int indexOf(String str)方法。

1、最笨的方法当然就是暴力匹配

  public int strStr(String ss, String pp) {
            int n = ss.length(), m = pp.length();
            for (int i = 0; i + m <= n; i++) {
                boolean flag = true;
                for (int j = 0; j < m; j++) {
                    if (ss.charAt(i + j) != pp.charAt(j)) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    return i;
                }
            }
            return -1;
        }

将pp匹配串与原串下标 i 开始匹配,一旦匹配失败,i++,继续重新匹配。
这样子效率极其低,

  • 时间效率为O(n*m),n 是字符串 ss 的长度,m 是字符串 pp 的长度。
  • 空间效率为O(1)

考虑这种情况:
在这里插入图片描述

当 i =1 ,j =1 开始(索引0做哨兵,存空格字符),一直匹配到 j=6时发现匹配失败。 若按照暴力(朴素匹配法),会跳出 j 循环。然后开始以下新循环做匹配判断:

  • i=2, j=1,匹配失败
  • i=3, j=1 匹配失败
  • i=4, j=1 匹配成功,i++ ,j++
  • i=5, j=2 匹配成功,i++ ,j++
  • i=6, j=3 匹配成功,i++ ,j++

然而由于我们知道当 j=6时,在此字符前的已匹配字符串中:蓝左(已匹配字符前缀)与蓝右(已匹配字符后缀)相等。

自然便得到有关系:蓝左=黄右(已被匹配的主串后缀)。
所以我们希望 i =6 不变,j =3,判断ss[6]与pp[3]是否相等。(此时这个j=3就是后文KMP中j=next[6]=3 得到的)
在这里插入图片描述

这样子便省略掉了朴素匹配算法中前4步不必要的判断。

由此诞生了KMP算法:

KMP代表了3位科学家

KMP算法的思想就是为pp字符串建立一个next数组,next[ i ]记录的是pp[ i ]字符前已匹配字符串的 前缀的 后一个字符的位置。

注意:此处及之后说的字符前已匹配字符串前缀与后缀之间的关系是两者为相等的字符串!

next[ i ] 有三种情况:

  • next[ i ]=0, 当 i=1的时候
  • next[ i ]=k, 当第i位字符前的字符串中,开头k-1位字符与结尾k-1位字符相等( k<i )
  • next[ i ]=1, 其他情况

ps:(不难知道, next[ 2 ]只要存在,其实值就只能是1)
以下给出几个8位字符串的例子:

  • aabcdaaz , next[ ]={0,1,2,1,1,1,2,3}
  • aaaaaaaz, next[ ]={0,1,2,3,4,5,6,7}
  • abcd efgz ,next[ ]={0,1,1,1,1,1,1,1}

next[ j ] 的含义就是当 ss[ i ] != pp[ j ] 时,跳转到 ss[ i ] 与 pp[ next[ j ] ]的匹配对比

给出next数组的求法:

    public static int[] get_next(String pp){
        pp = " " + pp; // 匹配串第[0]号字符设置为空格(哨兵),方便理解
        int pattern_len = pp.length();
        int[] next = new int[pattern_len];  //next数组长度等于匹配串数组长度
        int i=1;  // next数组的索引
        int j=0;  // 匹配串的索引
        next[1]=0;  
        while(i < pattern_len-1){
            if(j==0 || pp.charAt(i)==pp.charAt(j)){
                ++i;
                ++j;
                next[i]=j;  // 标记1, 在后续改进算法中,此行改为if-else
            }else{
                j=next[j];  //这一步看以下图解
            }
        }
        return next;
    }

关于next数组构建中,倒数第五行,next数组被使用的解释如下:
在这里插入图片描述

当j=6, i=13时, pp[ 6 ] != pp[ 13 ] , 令j = next[ j ] = 3。 只要p[ 3] == pp[ 13 ] 成立,则可以赋值pp [13]=3。( j字符前串的左黄与i字符前串的右红是相等的)

由此匹配字符串函数便可以写成:

        // KMP 算法
        // ss: 主串(string)  pp: 匹配串(pattern)
        public int strStr(String ss, String pp) {
            if (pp.isEmpty()) return 0;

            // 分别读取原主串和匹配串的长度
            int n = ss.length(), m = pp.length();

            // 构建 next 数组,数组长度为匹配串的长度+1 (索引0设置为哨兵)
            int[] next = get_next(pp);

            // 原串和匹配串前面都设置哨兵
            ss = " " + ss;
            pp = " " + pp;

            // 转化为字符数组
            char[] s = ss.toCharArray();
            char[] p = pp.toCharArray();

           int i=1,j=1; // 都从索引1开始匹配
           while(i<=n && j<=m){
               if(j==0 || s[i]==p[j]){
                   ++i;
                   ++j;
               }else {
                   j = next[j];
               }
           }
           if(j > m){
               return i-m-1;
           }else {
               return -1;
           }
        }

然而KMP算法仍然可以继续提高效率:

在这里插入图片描述
当pp[ 6 ]!= ss[ 6] 时候,j=next[ j ] =3 ,然而pp[ 3 ] 与 pp [6 ]相等,匹配的结果肯定为false,所以我们希望pp[6]直接等于next[ next[6] ]=1.
所以在构造next[ i ]时:
如果pp[ next[ i ] ] == pp[ i ]成立,则next[ i ] 应该等于 next[ next[ i ] ]。

将get_next()中的标记1, 那行代码改为如下if-else便可以改进。

if(pp[j]!=pp[i]){ // 当前字符与前缀字符不同时
  next[i]=j;
  }else { // 若该前缀字符与当前字符相同,则将前缀字符处的nextVal值赋给nextVal[i]
     next[i]=next[j];
        }

将改进后的next数组用nextVal来表示,完整的get_nextVal()函数如下:

  public static int[] get_nextVal(String pp){
        pp = " " + pp; // 匹配串第[0]号字符设置为空格(哨兵),方便理解
        int pattern_len = pp.length();
        int[] nextVal = new int[pattern_len];  //next数组长度等于匹配串数组长度
        int i=1;  // next数组的索引
        int j=0;
        nextVal[1]=0;  // 索引0为哨兵,从索引1开始记录
        while(i < pattern_len-1){
            if(j==0 || pp.charAt(i)==pp.charAt(j)){
                ++i;
                ++j;
                if(pp.charAt(i)!=pp.charAt(j)){ // 当前字符与前缀字符不同时
                    nextVal[i]=j;
                }else { // 若该前缀字符与当前字符相同,则将前缀字符处的nextVal值赋给nextVal[i]
                    nextVal[i]=nextVal[j];
                }
            }else{
                j=nextVal[j];
            }
        }
        return nextVal;
    }

这样子时间效率变成了O(n+m),空间效率为O(m),牺牲一点空间效率改进时间效率是非常值得的!

可以在理解的情况下,背下来get_nextVal()的构造方法。

【SAM2系列】windows单GPU复现时的bug解决记录 windows运行sam2,就感觉在开一艘破破烂烂的船,每走一步报一个错,bug源源不断的冒出来😭😭😭😭😭。 阅读详情

相关推荐

ElasticSearch集群搭建

docker安装es集群

weixin_46562226的博客 2024

kmp算法

kmp算法基本思想算法流程next向量计算代码图片来源 基本思想 目标(target):主串 模式(pattern):要在主串中寻找的子串 从左往右将模式的每个字符和对应位置的目标字符比较,在模式的第j位不匹配称为失配,则模式中失配位置之前的子串P0P1...Pj−1P_0P_1...P_{j-1}P0​P1​...Pj−1​全部匹配上: T:T0T1...T:T_0T_1...T:T0​T1​...TsTs+1...Ts+j−1T_sT_{s+1}...T_{s+j-1}Ts​Ts+1​...Ts+j−1

Disy13的博客 308

无人机基本组成部件

无人机基本组成部件

qq_37410522的博客 1万+

KMP模式匹配算法

KMP算法一种改进的模式匹配算法,由D.E.Knuth、V.R.Pratt、J.H.Morris于1977年联合发表。 它的大致思想是每当主串S和模式串T中的字符失配时,利用已匹配的结果,尽可能减少模式串T的回退位置(next数组),进而降低时间复杂度。

zhb2go的博客 324

《数学建模与数学实验》第5版 线性规划 习题3.4

1. 某鸡场有1000只鸡,用动物饲料和谷物混合喂养. 2. 某工厂用A1,A2两台机床加工B1,B2,B3三种不同零件. 3. 某工厂利用两种原料甲、乙生产$A_1、A_2、A_3$三种产品. 4. 每班的护士在值班开始时向病房报到,连续工作8个小时. 5. 某工厂生产 A1 、A2 两种型号的产品 6. 有两个煤厂A,B 7. 某工厂制造三种产品,生产这三种产品需要三种资源 8. 已知某工厂计划生产1,2,3三种产品,各产品需要在ABC设备加工。...

hexiaosi_的博客 2万+

Python接口自动化测试实战:Requests+Pytest+Excel+Allure框架搭建指南

接口自动化测试是现代软件工程中保障软件质量的关键实践,其核心原理是通过脚本模拟客户端请求,自动验证API的功能、性能和可靠性。在Python技术栈中,Requests库以其简洁的API成为处理HTTP请求的基石,而Pytest框架则凭借其灵活的Fixture机制和强大的参数化功能,为测试用例的组织与执行提供了优雅的解决方案。结合Excel进行数据驱动测试,能够有效实现测试数据与脚本逻辑的分离,提升协作效率;最终通过Allure生成可视化测试报告,清晰呈现测试结果与过程。这套技术组合(Requests, Py

weixin_28677451的博客 304

字符串匹配——KMP算法

字符串匹配——KMP算法 ​ 字符串匹配是计算机编程中最常使用到的基础算法之一。字符串匹配相关的算法很多,Knuth-Morris-Pratt(KMP)算法是最常用的之一。最近在学习KMP算法,学习了许多相关的博客,记录一下,以备日后不会写了回来看看。 ​ KMP算法有两个要点:1)部分匹配 和next数组的计算;2)利用部分匹配表解决字符串匹配问题。 1、KMP算法原理 (1)原理 ​ 给定两个字符串:文本串S="BBC ABCDAB ABCDABCDABDE"和模式串P="ABCDABD",要求找

哦豁灬 2万+

PyBioMed学习

PyProtein。

weixin_63016274的博客 1401

字符串匹配

主串和模式串 在字符串A中查找字符串B,那字符串A就是主串,字符串B就是模式串。 我们把主串的长度记作n,模式串的长度记作m。因为我们是在主串中查找模式串,所以n>m。 几种单模式串匹配算法 BF(暴力)算法 RK算法 BM算法 KMP算法 1. BF(Brute Force)算法 时间复杂度O(n*m),其中n是主串长度,m是模式串长度。 缺陷:忽略了已检测过的文本信息。 2. ...

记录每一个小阶段的学习心得,持之以恒! 6992

【硬刚Hadoop】HADOOP MAPREDUCE(1):概述

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2MapReduce优缺点 2.1 优点 1)MapReduce易于编程 它简单的实现一些接口,就可以完成一个分布式程序..

微信搜:import_bigdata,大数据领域硬核原创作者 462

Multisim14.0仿真(五十九)基于74LS161的24进制计数器应用设计

它具有同步预置、异步清零功能,支持并行数据加载,并可在计数使能控制下进行二进制计数。:低电平时,在下一个时钟上升沿加载输入数据(A, B, C, D)。(多个 74LS161D 串联构成 8 位、12 位等更长计数器)。低电平时,下一个时钟上升沿加载输入数据(A, B, C, D)。:低电平有效,立即清零计数器(不受时钟控制)。均为高电平时,每个时钟上升沿计数。:两者均为高电平时,计数器才能递增。:立即清零计数器(不受时钟控制)。(通过预置初始值控制计数范围)。(计数范围:0 ~ 15,即。

corlin6688的博客 4759

字符串匹配算法

字符串匹配算法

生活需要深度 7676

C++ Qt6 QtQuick/QML入门进阶与项目实战视频教程

C++ Qt这些年在PC客户端、嵌入式、汽车座舱仪表等领域应用很广泛,例如剪映专业版、微信4.0、亿图脑图、Steam、美图秀秀、腾讯会议、钉钉(部分模块)等都是使用C++ QWidget/QML开发。特别是QML这种声明式UI开发更加快捷,QML的界面开发效率相对于QWidget更快速,界面效果更好,QtQuick/QML在Qt6版本也逐渐完善了,使用QML进行客户端开发是个不错的选择。

琅嬛福地 4487

字符串匹配: BF与KMP算法

详细介绍字符串匹配相关的算法, BF是暴力匹配的算法, 而KMP算法中最重要的是要理解next数组原理和作用, 掌握如何求解next数组.

trong_ 的烂笔头 2802

深度学习工具包 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")

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

字符串匹配算法:BF算法 && KMP算法

字符串匹配算法 本章重点: 1、暴力匹配(BF)算法 2、KMP算法 BF算法 百度百科: BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。 时间复杂度为O(M*N)。 假定给出字符串"ababcabcdabcde",然后给出子串"abcd",现在查找

Bitdancing的专栏 775

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

详解字符串的快速匹配算法:KMP

在字符串匹配算法里,有两种较为常见的方式,BF 算法与 KMP 算法。 BF 算法是指将主串的第 I 个字符与模式串的第1个字符进行比较,如果相等便继续进行比较操作;若不匹配时,回溯到主串的第 I+1 个字符继续与模式串的第1个字符进行比较,直到结果出现。 而 KMP 算法则是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数来实现快速匹配,当出现匹配不相等时,不需要回溯,只需利用已经得到的匹配...

GitChat 7882

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【KMP算法】KMP算法揭秘:高效字符串匹配的艺术

KMP算法的讲解及应用

2403_87459748的博客 1619

程序员常用十大算法(四):KMP算法 与 暴力匹配算法 解决字符串匹配问题

给出如下两字符串: String str1=“lovilovilovloveiloveyou”; String str2=“ilove”; 要求从 str1 中找出是否存在目标字符串 str2,如果有,返回第一次出现的首字符下标,没有返回-1. 暴力匹配算法: 思路分析: 假设现在str1匹配到了i位置,子串str2匹配到了j位置,则: 1)如果当前字符匹配成功(即str1[i]==str2[j]),则i++,j++,继续匹配下一个字符 2)如果失败(即str1[i]!=str2[j]),令i=i-(j-1

qq_45273552的博客 2587

C++实现字符串匹配——KMP算法:

KMP算法 KMP算法 KMP算法 #include <iostream> #include <vector> #include <string> using namespace std; int ViolentMatch(string& s, string& p) { int sLen = s.size(); int pLen = p.size(); int i = 0; int j = 0; while (i < sLen &am

JMW1407的博客 3590

字符串匹配三大O(n)算法:KMP,Manacher,扩展KMP

讲三个玄学算法,我肝要爆了

偶耶的博客 495

字符串匹配算法:暴力匹配、KMP 算法、Boyer-Moore 算法、Rabin-Karp 算法

字符串匹配算法是在一个字符串(称为文本)中查找另一个字符串(称为模式)出现的位置或者是否存在的算法。常见的字符串匹配算法包括暴力匹配、KMP算法、Boyer-Moore算法和Rabin-Karp算法。

xhc6666的博客 2181

字符串模式匹配:KMP 算法

Knuth-Morris-Pratt (KMP) 算法通过实现线性时间复杂度(表示为 O(n)))彻底改变了字符串匹配。该算法由 Knuth、Morris 和 Pratt 于 1970 年推出,通过使用“前缀表”(也称为 LPS(最长的专有前缀,也是后缀)表)来有效地识别文本中的模式。与传统方法不同,KMP 避免了冗余比较,从而提高了性能。通过按顺序比较字符并利用预处理表,KMP 最大限度地减少了回溯,使其成为各种计算应用中高效字符串模式识别的基石算法。

新华编程特战队 2069

数据结构与算法十:字符串匹配-暴力匹配算法与KMP算法

一、字符串匹配常用算法: 暴力匹配 KMP算法 二、暴力匹配: /** * @author:songwl * @Date:2022/2/15 22:03 * @Description: */ public class Stringforcematch { public static void stringforcematch(String string1,String string2) { for(int i=0;i<string1.length();i++)

qq_38837032的博客 987

字符串匹配:从暴力算法到KMP

本文介绍了字符串匹配的基本概念,重点对比了暴力匹配和KMP两种算法。暴力匹配简单直接但效率低(O(n*m)),而KMP通过预处理构建部分匹配表,利用已知匹配信息实现智能跳转,将时间复杂度降至O(n+m)。文章详细讲解了KMP的核心原理、部分匹配表的构建方法,并通过代码示例展示了两种算法的实现。最后指出实际开发中应优先使用语言内置的字符串查找功能,但理解这些算法原理对解决复杂匹配问题很有帮助。KMP特别适合模式串重复度高、需要多次匹配的场景,为文本处理、生物信息学等领域提供了高效解决方案。

从不水文,坚持创作,加油 905

KMP算法:字符串匹配的智慧跳跃

KMP算法还没明白?来吧,里面有你要的一切

wzh18907434168的博客 1059

算法:字符串匹配算法KMP

算法

Python开发分享的博客 579
上一篇: HashMap数据结构剖析(JDK8红黑树)拓展到Integer自动拆装箱及缓存
下一篇: 快速排序(优化递归栈)
老邓CODING
博客等级 码龄8年 9粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值