KMP算法的两种模板

算法学习之KMP(模板整理) 犹记当年学习C语言的字符串的时候那个悲情。。。 于是组队之后果断声明:鶸不玩字符串 然后将字符串丢给队友。。。 后来觉得吧,一些基础的东西还是要会的,比如KMP 粗浅的学了下KMP算法,也不敢瞎说什么,主要整理了下模板 学习记录: 主要看了刘大大的蓝书《算法竞赛入门经典--训练指南》 还有几篇博客:                            1. KMP算法详解 阅读详情

个人感觉这种比较好理解
讲解的很好的一篇文章KMP算法详解
例题leetcode

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(!needle.size()) return 0;
        int szn = needle.size(),szh = haystack.size();
        vector<int> nex;
        nex.push_back(0);
        int pos = 0;
        for(int i = 1;i<szn;)
        {
            if(needle[i] == needle[pos])pos++,i++,nex.push_back(pos);
            else if(pos) pos = nex[pos - 1];
            else nex.push_back(0),i++;
        }

        pos = 0;
        for(int i = 0;i<szh;)
        {
            if(haystack[i] == needle[pos])i++,pos++;
            else if(pos)pos = nex[pos - 1];
            else i++;

            if(pos == szn)return i - pos;
        }

        return -1;
    }
};

加上0这个位置上的哨兵

class Solution {
public:
    int strStr(string s, string p) {
        int n = s.size(), m = p.size();
        if(m == 0) return 0;
        //设置哨兵
        s.insert(s.begin(),' ');
        p.insert(p.begin(),' ');
        vector<int> next(m + 1);
        //预处理next数组
        for(int i = 2, j = 0; i <= m; i++){
            while(j and p[i] != p[j + 1]) j = next[j];
            if(p[i] == p[j + 1]) j++;
            next[i] = j;
        }
        //匹配过程
        for(int i = 1, j = 0; i <= n; i++){
            while(j and s[i] != p[j + 1]) j = next[j];
            if(s[i] == p[j + 1]) j++;
            if(j == m) return i - m;
        }
        return -1;
    }
};
【算法模板】KMP算法 简述 KMP算法:由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,串匹配算法,一般串都是指字符串。KMP是基于双指针算法的 应用:一个字符串在另外一个字符串中出现的位置和 循环节 一般地,被匹配的字符串叫主串,用来匹配主串的叫模式串 如果我们不用KMP,来查找一个字符串在另外一个字符串中第一次出现的位置,暴力求解时间复杂度是O(NM),用KMP优化查询时间复杂度是O(1),但是空间复杂度是O(N)。M和N分别是模式串和字串的大小。 KMP讲解 我觉得MOOC浙江大学数据结构讲的很不错, 阅读详情

相关推荐

vasp-自旋轨道耦合(SOC)计算步骤

在VASP中执行自旋轨道耦合(SOC)计算,具体的计算步骤如下: 结构优化获取CONTCAR文件 自洽计算(collinear normal VASP calculations)获取IBZKPT,CHGCAR和WAVECAR文件。 SCF+SOC计算,在此步骤中,将步骤2中的IBZKPT复制为KPOINTS,以便两个步骤具有相同的k网格,因此可以读取步骤2中的CHGCAR和WAVECAR文件。 能带结构计算,在此步骤中,将KPOINTS改为高对称点,读取步骤3中的CHGCAR和WAVECAR文件。

懒散的鱼与消失的猫 3万+

leetcode 28. 实现strStr()

实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。示例 1:输入: haystack = "hello", needle = "ll" 输出: 2 示例 2:输入: haystack = "aaaaa", needle = "bba" 输出...

别云间的博客 2908

第四届“网鼎杯”网络安全大赛 - 青龙组

第四届“网鼎杯”网络安全大赛 - 青龙组

lpppp小公主的博客 1315

KMP模板及优化

KMP模板 #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; const int maxn=10001; int next[maxn]; char s[maxn]; char p[maxn]; int cnt=0; void prefix_next(int n){ next[0]=0; int len=0; int i=1; while(...

Anoyer的博客 2143

手把手教你用Wireshark抓包分析Profinet非周期通信(附实战案例)

本文详细解析了PROFINET非周期通信(RTA)的技术原理与实战应用,通过Wireshark抓包分析,揭示从PLC请求到驱动器响应的完整对话过程。涵盖实验环境搭建、关键配置步骤、典型参数访问流程及故障诊断案例,帮助工程师深入理解并优化工业网络通信性能。

Black的专栏 1050

IMA知识库:从0到1的架构设计与实践

本文探讨了AI时代知识库系统的架构设计与演进路径。通过分析知识入库、知识管理和知识应用三大核心业务流程,提出了应对数据多样性、处理标准化、流量洪峰等挑战的解决方案。重点介绍了基于统一数据格式的解耦设计、异步处理架构、服务拆分策略以及权限安全体系,构建了一个稳定、高效且可扩展的知识库系统。文章强调优秀架构需要持续演进,通过识别薄弱点不断优化,最终实现技术方案与业务需求的平衡。

lovehu6686的博客 1739

KMP模式串匹配模板

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。 BF算法是一种很好理解的字符串匹

oliver233的博客 468

UG\NX二次开发 获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态

获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态。

王牌飞行员_里海的博客 1984

KMP模板

【代码】KMP模板。

DOUBLEYFC的博客 152

手把手教你学Simulink--电机控制架构与算法实现​场景示例:基于Simulink的电机速度环PID调节仿真

本文带你完成了电机速度环PID参数的科学整定,实现了:✅ 理解了速度环的级联系统特性与关键参数影响工程整定法(理论初值)系统辨识法(参数未知时)✅ PID Tuner自动调参(推荐!自动调参兼具快速性与鲁棒性✅ 学会了前馈补偿抗饱和等工程实用技巧。

MHD0815的博客 653

RK3588平台开发系列讲解(项目篇)常见模型结构

📢 AI 模型常采用人工神经网络来模拟人脑神经的记忆和处理信号的能力。常见的人工神经网络类型有深度神经网络(Deep Neural Network,DNN)、卷积神经网络(Convolutional Neural Network,CNN)、循环神经网络(Recurrent Neural Network,RNN)等。

内核笔记 1759

【算法模版】kmp

kmp函数:设置双指针i,j初始指向0,若ij对应的主串和子串字符匹配,同时移动ij一步,否则将j next映射一次(子串先和发生不匹配的位置对齐,再通过j对应的next向左移动对应步数),若ij任何一个移出字符串就停止,说明此时是。移动,若不是刚开始且ij指向的字符不相等,就不断移动j到next[j-1],若ij指向的字符相等,就j++,移动,若不是刚开始且ij指向的字符不相等,就不断移动j到next[j-1],若ij指向的字符相等,就j++,next:下标对应的最长公共前后缀,是对于从当前下标字母的。

aA467646767的博客 355

2025年CSP-X初赛真题及答案解析(江西)(完善程序第1题)

2025年CSP-X初赛真题及答案解析(江西)(完善程序第1题)

王老师青少年编程 715

kmp模板

我的习惯写法, 自己复习用: #include #include #define N 1005 char a[N], b[N]; int d1, d2; int next[N]; void Get_next(){ int i, j; i=1, j=0; next[1]=0; while(j<d2){ if(j==0||b[i]==b[j]){

icodeajk的博客 357

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

牛客算法周周练18B - 救救企鹅(kmp模板题)

题目大意: 给出三个串 A B C,你的任务是从A中找到所有子串和B相等的串并替换为C串,输出替换后的字符串。 解题思路: kmp模板题,套用kmp的板子,每次找B串,然后用sting.replace()换掉即可,如果找不到则退出循环。 Code: /*kmp*/ #pragma GCC optimize(2) #include <cstdio> #include <iostream> #include <algorithm> #include <cmath&gt.

在读NLP硕士 238

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

kmp算法巩固 以poj3461为试验

本来计划下一步去搞AC自动机的……忽发现它以KMP为基础……虽然假期练过,但基本内涵都不太清楚了,都是直接套模板Orz……是本次来再补一下(⊙﹏⊙) ,总算把自己的板给写出来了,真是可喜可贺XD 以下先是KMP的重新理解部分:用parent[]表示母串,son[]表示子串 当比较母串和子串时,以abcdefg和bcdf为例 母串: a b  c  d e f g 子串:    b  c  

╱/( ◕‿‿◕ )\╲ 528

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

KMP模式匹配算法模板

模板1: 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 void InitNext(char *s, int *next){ 5 int i = 0, j = -1, len = strlen(s); 6 next[0] = -1; 7 while(i &...

62

KMP、扩展KMP、Manacher模板

推导过程推荐看这篇: KMP模板: 1 void init(){ 2 int j = nex[0] = -1, i = 0; 3 int len = strlen(str); 4 while(i < len){ 5 if(j == -1 || str[i] == str[j]){ 6 nex[++i...

weixin_30571465的博客 68

字符串匹配KMP算法

字符串匹配问题:求出模板在文本中的所有匹配点,所谓匹配点是指从当前点开始,在模板的长度内,模板与文本字符一样。 朴素的字符串匹配,当模板与文本不匹配时,模板右移一位然后,从模板0位置开始继续检测当前文本点是否是匹配点。复杂度n*m。 KMP匹配: 核心思想:当模板与文本在某点不匹配时,不是模板重新开始从0位置开始进行匹配,而是充分利用文本中已经匹配过的字符串,构造一个失配函数

smilesundream的博客 275

关于KMP算法的重大发现

之前写KMP模板的时候,nx[i]代表最大的一个x,使s[1,x-1]是s[1,i-1]的后缀。(方法1) 然而网上还有另一种方法求nx数组,nx[i]表示最大的一个x,使s[1,x]是s[1,i]的后缀。(方法2) 两种nx数组在具体匹配的时候方法稍有不同,但都能正确匹配字符串。 但是在做字符串DP题的时候,发现网上的题解大多是利用第二种nx数组的性质进行状态的转移。 当时试着写了一下那...

weixin_30568715的博客 93

【模板】KMP字符串匹配

KMP字符串匹配中next数组求法【模板】KMP字符串匹配 KMP字符串匹配中next数组求法 char* strstr(char*str,char*pattern);//字符串很小O(m.n) 子串里面一头一尾有可以匹配上的小串,指针不用每次都回溯到最最开头的位置。 匹配前,对模式串进行详细分析, 搞清楚next值的含义, p[0 ~ j]==p[ (i-j) ~i] ,即从p[0]开始长度为len=j+1,都有p[j]= p[i] 那么一旦p[i+1]与t[?]不相等了,t[?]下一个就要与p[j.

qq_51070956的博客 1262

校内学习——串(kmp算法

最后终于在第一个版本的基础下debug成功!但是这个程序在vs运行仍然会报错,不知道为什么,但是结果都是正确的,刚刚的问题在于忽略了当i或者j到达最大值后,他们还会+1,与后面的程序对不上了!于是这里加了一个限制条件 ,终于成功。第二块代码说明了一些限制范围问题,明天再研究一下,同时明天背一下另一种next数组的模板。solution:询问老师后,ababcabcacbab abcac 这个测试用例有问题。那个作者的代码改了一下,依旧是上面这个不过。

wy_xzc的博客 135

字符串算法总结——扩展KMP算法

扩展KMP算法 功能:处理字符串 S 的所有后缀与字符串 T 的最长公共前缀。 需要的数组 1.Next数组 next[i] 表示后缀 i 即 Ti⋯∣T∣​ 与 T 的最长公共前缀。 例如 数组索引 1 2 3 4 5 6 7 8 9 字符串数组 a a a b a a a a b next...

LiuKairui的博客 539

KMP+哈希整理

题目链接: 两道模版题: CF471Dhttp://codeforces.com/problemset/problem/471/D POJ3461http://poj.org/problem?id=3461 KMP模版: kuangbin: void get_next() { Next[0]=-1; int i=0,j=-1; while(i<wlen){ while(-1!...

Buyi的博客 215

KMP的实践....每天都有提高!

本人100%蒟蒻,,绝对不谦虚!!! 内容简单!本属个人YY,绝对知道教育贴,完全记录每天的进展! 囚了2天,终于把KMP基本弄懂了,5555555555555555555555 早就想看KMP了,但是一直没能好好静下心来。这个一定要改!一定要改! KMP大家写起来都大同小异,都是模板,核心就2个循环,最多10几行。 对于for套while和光while的2种

Trigon 504
上一篇: 【leetcode】剑指offer 26. 树的子结构,利用递归进行匹配
下一篇: 【java后端学习】java语言基础(夯实基础)
Andy in boots
博客等级 码龄7年 73粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值