KMP代码及思路解析

2025年上海交通大学计算机考研复试机试高频考点解析(附KMP算法优化思路与AC代码) 本文深入解析2025年上海交通大学计算机考研复试机试高频考点,重点讲解字符串处理、动态规划和图论算法。特别针对KMP算法进行优化思路剖析,提供AC代码实现,帮助考生高效备考。文章还总结了机试备考建议,包括重点突破高频考点、时间管理训练等实用技巧。 阅读详情


首先推荐这篇KMP思想的介绍:字符串匹配的KMP算法


KMP代码的关键是:

1、得到搜索串每个字符的匹配值

2、当字符匹配失败时的转移

(搜索串指搜索目标串。)


1:

第一个循环:遍历每个字符,表示搜索的是 该字符及之前所有字符组成的串。

第二个循环:遍历所有长度的子串。

第三个循环:比较子串是否相同。

搜索的目标是:所有相同的子串中最长字串的长度。所以维护一个maxl变量。

(在此“子串”指前缀和后缀。)

(代码中未清零model数组。)

2:

匹配失败时的转移就很简单了。

若当前字符匹配失败,前一字符的model值就是前面已匹配串的前缀与后缀相同的个数,直接令搜索串的偏移等于该数值就行。(代码不同由于数组脚标可能会有+-1差别。)



void inis(string t, int* model){
    //初始化得到搜索串的模式
    //第一个循环 i为字符串尾
    for(int i=1; i<=t.size(); i++){
        //第二个循环 k为字串长度
        for(int k=1; k<i; k++){
            //cout<<"k:"<<k<<endl;
            int maxl = 0;//最长匹配子串的长
            bool ok = true;
            //第三个循环 h为子串比较的位
            for(int h=0; h<k; h++){
                //cout<<"h:"<<h<<"--"<<t[h]<<" "<<t[i-k+h]<<endl;
                if(t[h] == t[i-k+h]){
                    maxl++;
                }else{
                    ok = false;
                    break;
                }
               // cout<<h<<"-"<<len-k+h<<endl;
            }
            if(ok && maxl>model[i-1]){
                model[i-1] = maxl;
            }
        }
    }
}
int sf(string s, string t, int* model, int off){
    //从偏移off处开始搜索 返回目标串首字符从0开始的索引
    int slen = s.size();
    int tlen = t.size();
    int i=off, k=0;
    for( ; i<slen; i++){
        //cout<<"i:"<<i<<endl;
        //cout<<s[i]<<"  "<<t[k]<<endl;
        if(s[i] == t[k]){
            //cout<<"k++  "<<k<<endl;
            k++;
        }else{
            //状态转移
            if(k != 0){
                k = model[k-1];
                i--;
            }
        }
        if(k == tlen){
            return i - k + 1;//首
            //return i;//尾字母
        }
    }
    return -1;
}


KMP算法图解 目录KMP算法介绍KMP最佳应用——字符串匹配问题思路分析图解代码实现 KMP算法介绍 KMP是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法 Knuth-Morris-Pratt字符串查找算法,简称“KMP算法”,常用于在一个文本串str1查找一个模式串str2的出现位置 KMP算法利用之前判断过的信息,通过一个next数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过next数组找到,前面匹配过的位置,省去了大量的计算时间 KMP最佳应用——字符串匹配问题 字符串 阅读详情

相关推荐

KMP算法代码

KMP next算法

KMP算法代码及图文方式详解

字符串模式匹配中的KMP算法详解,了解前后缀与真前后缀,代码图文方式详解next数组求解以及模式串如何回溯过程

初始化的博客 4244

告别命令行!用这个开源的Web版Kettle工具,5分钟搞定数据集成任务编排

本文介绍了一款开源的Web版Kettle工具,通过直观的拖拽界面大幅提升数据集成效率,告别复杂的命令行操作。该工具基于Kettle核心引擎,支持跨平台协作、轻量化访问和降低学习曲线,特别适合业务分析师快速上手。实测显示,使用该工具后任务配置错误率下降62%,协作效率提升40%。

weixin_30267785的博客 435

【数据结构】KMP算法代码实现(c语言、c++完整代码)

kmp算法c语言、c++代码完整实现。

m0_62332728的博客 5327

第四篇:关于python程序打包的问题-找不到fsspec

这个问题困扰了我将近两天的时间一直找不到什么好的办法,甚至打算放弃。主要原因是身边没有可以述说的人,也没有可以请教的人。正在想要放弃的时候找到了解决办法。 打包后运行程序是这样的, 大概意思是找不见fsspec这个依赖,刚接触python说实话对于这些第三方库理解不是很到位,我的理解就是:类似于java程序中的jar包,程序找不见了。可怎么让他找见了,刚开始以为我自己没有安装fsspec,在cmd中进行了安装,结果如下图所示 很明显,已经安装并且安装目录都有,跟着网上的一些解决办法,在打包的时候把这.

weixin_47861710的博客 5865

【Blockly开发教程】01 初识Blockly

Blockly 是由 Google 开发的开源代码库,它可以为网页程序和移动端应用程序添加可视化代码编辑器。

Bright的博客 4512

KMP可实现代码及解析

kmp 的小小个人愚见

qq_56012214的博客 974

开源浏览器插件开发实战:从零搭建多平台内容分发工具

浏览器扩展(Browser Extension)是运行在浏览器上层、通过标准Web技术增强浏览器能力的轻量级程序,其核心价值在于对页面内容的读取、操作与跨应用信息流转。在内容创作与分发场景中,创作者频繁需要在公众号、知乎、优快云、头条等平台间搬运同一篇文章,而传统SaaS分发工具往往受限于免费额度、授权托管和平台适配滞后等问题。基于Manifest V3规范,开发者可以构建一款100%开源、永久免费的浏览器插件,利用content script完成从源文章页提取标题、正文与图片,通过消息通信机制将结构化数

weixin_29882269的博客 296

KMP算法图解易懂版(内含模板代码)

KMP保姆级图解教程,通俗易懂,从0学kmp,从原理到例子,从手算到代码 什么是kmp? 在主串中快速找到想要的子串。 解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。 几个概念 公共子串:模式串与主串左边相匹配的串 公共前后缀:公共子串中相同的字符串,前者为前缀,后者为后缀,注意是在比较指针以左 ...

LarsGyonX的博客 1931

EXCEL VBA从入门到精通 第一章:VBA入门

在VBA中,需要使用关键字Dim来定义一个变量,后面跟上变量名和变量的数据类型。例如,下面的代码定义了一个整型变量x和一个字符串变量name在VBA中,使用关键字Const来定义常量,后面跟上常量名和常量的值。例如,下面的代码定义了一个整型常量MAX_NUM和一个字符串常量MESSAGE需要注意的是,常量一旦被定义,其值就不能被改变。

1万+

常说的cache机制到底是什么?L1 cache和 L2 cache是什么?

一文带你迅速了解CPU内的cache机制!!图解多核CPU中的多级cache结构。为何有的处理器没有cache?

车载系统攻城狮 5878

KMP算法完整代码

【代码】KMP算法完整代码。

lt2018_的博客 906

C++实现复制粘贴文本功能

要实现这个功能,我们需要使用操作系统提供的函数来操作剪贴板。在Windows操作系统中,我们可以使用Windows API函数来访问剪贴板。总结起来,使用C++实现复制和粘贴文本功能涉及使用操作系统提供的API函数来操作剪贴板。在本篇文章中,我将向您展示如何使用C++编程语言实现复制和粘贴文本的功能。我们将使用操作系统提供的API来进行剪贴板操作,并编写相应的代码来完成这个任务。如果您使用的是Linux操作系统,您需要使用适当的库和函数来访问剪贴板。函数中,我们首先将一个字符串复制到剪贴板中,然后使用。

PixelDyno的博客 1233

KMP思路解析与代码实现——next数组与nextVal数组实现详解

文章目录1.引入思考2.研究模式串2.1 普遍情况2.1.1 匹配算法2.1.2 边界问题2.1.3 代码实现2.2 特殊情况3.正式匹配 1.引入思考 我们首先假设是一个毫无算法基础的同学,会怎么写这道题呢? 应该是对这两个字符串进行依次匹配。虽然繁琐了一点,但总能匹配出结果。其实这也就是算法开始的基础和雏形。KMP没有在开辟一个新方法,而只是对原有的基础方法进行浓缩,提炼。 当我们看到以上两个字符串,用==我们的肉眼可以清晰的从第一次匹配,跳到第二次匹配。为什么呢?==因为当我们匹配到第一个 d 时,

脉冲星飞行记录 3420

【车联网】Automotive 软件过程能力成熟度模型——ASPICE标准入门介绍

ASPICE标准详细定义了与汽车电子软件开发相关的各种术语和概念,包括软件组件、系统集成、测试和验证等。这些定义确保了所有开发团队在使用相同术语时具有一致的理解。

奶爸的编程之路,也就一周冷个三天 2679

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【KMP+随机算法(Monta Carlo+Las Vegas)】字符串匹配 思路解析和代码

字符串匹配 对于字符串X和模式串Y(由0-1组成),使用两类随机算法,蒙特卡洛和拉斯维加斯算法求解两串是否匹配,随后再使用KMP检验两串是否匹配进行验证,统计三种算法的运行时间和蒙特卡洛算法的错误率,分别对字符串X长度为50,500,5000,50000进行检验,模式串Y不能太短 个人思路 思路 KMP算法 next[j]表示模式串的子串0 ~ j与 子串 j+1 ~ 模式串.size() 的最长相等前后缀 的前缀的最后一位 使用根据模式串,计算各位其对应的next[]数组 执行KMP算法,遍历字符串X,

九筒的博客 3221

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

KMP——字符串匹配

本文是小白博主对KMP的详细解析,包括KMP字符串匹配过程、next数组求解过程及代码展现、超详细代码注释及纯享版代码,适合算法小白快速掌握KMP算法。

代码欢乐豆 2730

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

KMP算法详解

前言 KMP具体的算法思路在这篇博客中已经提及。 这么多天没看,手打KMP都有点费劲,不过在回想算法思路的过程中,感觉对代码的理解提升了一个层次。下面就按照KMP模板,对代码进行讲解。 代码详解 注释1: nxt数组,nxt[i]表示字符串str前i个字符前缀的最大前缀后缀公共长度。 注释2: 预处理nxt数组是KMP算法的前提。 注释3: k表示j-1的最大前后缀公共长度,也即nxt[j-1]。但是如果j-1的下一次不能成功匹配,也就是str[j]和str[k]不一样,那么k就回溯,这时候的k不再表示nx

陈颜的博客 5813

算法笔记--KMP模式匹配算法

看完数据结构,串这一章之后,对其中的kmp算法,感觉总是模凌两可的感觉,有一种将要入门却不知道该脉哪只脚的感觉,想把自己的理解写出来,求大佬们指点一下。 下面所提到的字符串都是基于如下的字符串定义: #define MAXSIZE 15 struct String{ char data[MAXSIZE]; int length; }a = {"goodgoogle",10},b =...

pounds008的博客 311

kmp算法代码实现(c++)

讲解视频推荐: 「天勤公开课」KMP算法易懂版_哔哩哔哩_bilibili 帮你把KMP算法学个通透!(求next数组代码篇)_哔哩哔哩_bilibili 以上两个视频第一个主要是讲解思路,第二个阐述了代码实现以及运行过程,讲解很清晰 代码: //KMP算法 #include <bits/stdc++.h> using namespace std; void getnext(int* next,string s){ //初始化 处理相等的情况 //不想等的情况 更新数组的值

weixin_51060919的博客 621

牛客小白月赛19(A,B(DP),C(二维前缀和),D(水),E(结论),F(kmp+hash),G(水dfs))

题目连接:https://ac.nowcoder.com/acm/contest/2272#question A水题一个 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=(b);++i) #define mem(a,x) memset(a,x,sizeof(a)) #define pb push_back ...

ccsu_deer 504

浅析KMP算法

文中详细阐述了KMP的优化思路、border概念及next数组的构建方法,并通过示例演示算法执行过程。

doooge_awa的博客 1056

KMP算法和代码解析

KMP算法和代码解析 1.KMP算法的思想 KMP应用在字符串匹配上,和暴力匹配的最大改进就是找到一个最合适的位置进行“回溯”。 首先求要匹配字符串的前缀和后缀,再得到“next数组”(用于找回溯的位置)。然后利用这个“next数组”进行匹配。 2.代码 咱们直接上代码 void make_next(const char *pattern,int *next){ int q = 1, k = 0; int m = strlen(pattern); next[0] = 0

weixin_39884313的博客 262

浅入浅出KMP算法

在看算法基础书籍时,看到KMP算法的解释是用的DFA(有限状态自动机),看的我一脸懵逼。所以,就去网上搜索有没有更容易理解的方式去实现KMP算法。看了很多篇,感觉下面这篇博文讲的比较清楚,但是也花了我挺长时间去看懂的。(好吧好吧,智商不足=_=) KMP,深入讲解next数组的求解 后面经过自己的思考总结,在这里记录一下自己对KMP算法的理解和实现。KMP算法的原理关于KMP算法的原理,上面给出

蘑菇君的学习之路 1304

kmp算法的原理及理解

kmp算法的原理及理解 前言     之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k;但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32章 字符串匹配虽然讲到了对前后缀计算的正确性,但是大量的推理证明不大好理解,没有与程序结合起来讲。今天我在这里讲一讲我的一些理解,希望大家多多指教,如果有不...

IT老农民的博客 1300
上一篇: 大整数运算---模拟笔算
下一篇: 100层楼摔鸡蛋问题
windroid
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值