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

同花顺自动化交易避坑指南:pywinauto实战中验证码识别与界面弹窗处理

本文深入探讨同花顺自动化交易中的关键稳定性问题,重点解决验证码识别与弹窗处理两大难题。通过优化Tesseract OCR、整合打码平台API以及设计pywinauto弹窗监控体系,提供了一套完整的自动化交易解决方案,帮助交易者有效规避资金账户和持仓信息操作中的常见陷阱。

weixin_33734785的博客 487

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

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

m0_62332728的博客 5327

CUDA编译踩坑实录:如何正确设置-gencode参数适配你的GPU算力

本文深入解析CUDA编译中-gencode参数的核心原理与实战配置,帮助开发者解决常见的'Unsupported gpu architecture'错误。通过厘清虚拟架构与真实架构的区别,并提供多版本兼容的CMake配置方案,确保编译出的代码能精准适配不同GPU算力,兼顾性能与广泛兼容性。

weixin_28829903的博客 338

”COMSOL“竟然如此简单!我悟了!!

COMSOL Multiphysics具有强大的多物理场全耦合仿真分析功能、高效的计算性能,可以保证数值仿真的高度精确,已被广泛应用于各个学科领域,近年来运用COMSOL来解决电化学实际工程问题也越来越普遍。

C1012562281的博客 3448

KMP可实现代码及解析

kmp 的小小个人愚见

qq_56012214的博客 974

【推荐100个unity插件】帮助你快速开发一款FPS游戏—— FPS Framework

FPS Framework 快速入门指南 FPS Framework 是一个 Unity 开发框架,可加速 FPS 游戏开发。主要功能包括: 第一人称控制器:基于 Character Controller 实现,提供移动、跳跃、下蹲等功能,支持自定义参数调整 渲染管线转换:内置 RP 转换器,支持 URP/HDRP 等渲染管线一键切换 库存系统: 采用双列表管理:物品列表(Items)和可收集物列表(Collectables) 支持自定义库存物品和可收集物类型 提供拾取/丢弃功能实现 快速开始: 通过预制件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2569

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

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

LarsGyonX的博客 1931

蓝鸟四轴飞控系统C程序V3.0(基础版本)深度解读

2. 解析遥控通道数据(油门 / 横滚 / 俯仰 / 偏航),转换为标准化值(-1000~+1000);3. 封装PID初始化(PID_Init,配置KP/KI/KD、输出限幅、积分限幅);,包含姿态角(Attitude_Data.Roll/Pitch/Yaw)、角速度(Gyro_Data.X/Y/Z)、遥控值(RC_Data[0~5])、电池电压(Bat_Volt)、电机PWM值(Motor_PWM[0~3])、系统状态(Sys_State),校验和通过Check_Sum()函数计算;

搏博的专栏 344

ABAP CDS 货币与计量单位换算全攻略:CURRENCY_CONVERSION、UNIT_CONVERSION 与 DECIMAL_SHIFT 的工程化实践

本文介绍了SAP ABAP CDS中三种单位/货币换算函数(UNIT_CONVERSION、CURRENCY_CONVERSION、DECIMAL_SHIFT)的实战应用。重点包括:各函数的职责边界与适用场景,参数配置与精度控制策略,以及基于标准表(T006、TCUR*等)的换算规则来源。文章提供可运行的CDS示例,涵盖单位换算(如MI转KM)、货币汇率转换(含小数位处理)及纯小数位调整等典型场景,并强调生产环境中需注意的精度差异与审计风险控制。适用于企业报表、成本核算等需要统一口径的业务场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1554

KMP算法完整代码

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

lt2018_的博客 906

Autosar Configuration(十四)SomeIP之配置SoAd

本文主要介绍SomeIp协议栈中的SoAd在Configurator中的详细配置

king110108的专栏 2600

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

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

脉冲星飞行记录 3420

关于红队方面的学习资料

关于红队方面的学习资料

Sumarua的博客 1084

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

KMP——字符串匹配

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

代码欢乐豆 2730

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 蓝牙通讯demo

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

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、付费专栏及课程。

余额充值