KMP算法-字符串匹配

经典字符串匹配算法——KMP算法 KMP算法 KMP算法是一种高效的字符串匹配算法,在传统暴力遍历匹配的基础上做了一定的优化。 首先KMP算法的实现也是使用了回退思想,不过与暴力遍历不同,KMP的回退,是让子串进行匹配,而不是主串。 KMP示例 首先我们来看两个例子来理解KMP算法: 例1: 分别从str的i和sub的j位置处开始匹配: 此时a与c不匹配,如果暴力遍历的话,是i回到到b,j也回到a,重新一轮匹配。而KMP算法,是将子串的j回到第二个a,str[i]与sub[j]重新开始匹配。原因很明显,第二个ab与第一个ab是相同的,因 阅读详情

先看看普通字符串匹配BF算法。

BF算法

BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。

代码实现:

int BFMatch(string s,string p){
    int i,j;
    for(i=0;i<s.length();i++){
        j=0;
        while(j<p.length() && s[i]==p[j]){
            i++;
            j++;
        }
        if(j==p.length()){
            return i-p.length();
        }
        i=i-j+1;
    }
    return -1;
}

KMP算法

原理介绍可以看篇文章:
http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html

大概思想就是:不匹配时,模式串的指针不是移动一步,而是根据部分匹配值来移动。
这里写图片描述
这里写图片描述
这里写图片描述

代码:

//生成串p的部分匹配值
vector<int> getMatch(string p){
    auto len=p.length();
    vector<int> match(len,-1);
    match[0]=0;
    for(int i=1,k=0;i<p.length();i++){
        while(k>0 && p[i]!=p[k]){
            //k对应的串往后移动(已匹配长度-部分匹配值),并且定位到部分匹配长度位置。
            //因为i不变,k更新到match[k-1]
            k=match[k-1];
        }
        if(p[i]==p[k]) {
            k++;
        }
        match[i]=k;
    }
    return match;

}
//找出s中p的所有匹配,返回每个匹配的首地址
vector<int> KMPMatch(string s,string p){
    vector<int> ret;
    vector<int> match=getMatch(p);
    for(int i=0,k=0;i<s.length();i++){
        while(k>0 && s[i]!=p[k]){
            k=match[k-1];
        }
        if(s[i]==p[k]){
            k++;
        }
        if(k==p.length()){
            ret.push_back(i+1-p.length());   //返回s中匹配p的所有首地址
            k=match[k-1];
        }
    }
    return ret;
}
字符串模式匹配算法——KMP算法 字符串是一种常见的数据结构,它由一个字符序列组成,可以被视为字符的数组或列表。每个字符都有一个对应的索引位置,允许对字符串进行访问、修改和操作。对于字符串而言,寻找字符串中子串的位置是最重要的操作之一,查找子串位置的操作通常称为。 阅读详情

相关推荐

字符串匹配算法--朴素匹配和KMP算法

字符串匹配:是输入源串与子串,在源串中寻找子串,并在源串中返回子串在源串中第一次出现的位置。 对此问题,我们提供两种方法:朴素匹配和KMP算法。我们假设源串长度为n,子串长度为m 朴素匹配:这个方法也称为暴力匹配,因为他就是我们最容易想到的一种字符串匹配的算法。就是从源字符串开始搜索,若出现不能匹配,则从原搜索位置+1进行搜索。 那么它的时间复杂度就需要O(n*m),可以看出时间复杂度很高。...

Eunice_fan1207的博客 1532

字符串算法之KMP(字符串匹配)

一、背景   给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题。   Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常用算法之一,这个算法是由高德纳(Donald Ervin Knuth)和沃恩·普拉特在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终三人于1977年联合发表。   在继...

青萍之末的博客 2万+

KMP字符串匹配算法

字符串匹配算法朴素字符串匹配算法Rabin-Karp算法有限自动机KMP算法 朴素字符串匹配算法 Rabin-Karp算法 有限自动机 KMP算法 KMP算法是Knuth,Morris和Pratt三人设计的线性时间字符串匹配算法。不管是网上还是书上介绍的这个算法都很复杂,让人看了头都麻了,但是它的算法思路是很简单的,就是尽可能地利用已知的信息,从而减少尝试匹配的次数。 什么叫尽可能地利用已知的信息呢? 假设我们有字符串T,要在T中匹配出字符串P。 假如匹配进行到如下图的过程,从T的第5个字符a开始的后五个字

m0_63989537的博客 1053

算法:字符串匹配

问题描述: 判断一个字符串(dst)是否是另一个字符串(src)的子串;输出子串在母串中的第一次出现的起始位置;匹配的时候区分大小写;不能使用库函数(使用库函数按0分计算); 要求实现函数: unsigned int str_str(char * src, char *dst);  返回:如果dst是src的子串 则返回起始位置;如果不是 则返回0  输入:src 指向母串的指针

一路前行的专栏 942

别再为EPI形变头疼了!FSL的topup+eddy实战保姆级教程(含AP/PA数据采集要点)

本文详细介绍了如何使用FSL的topup和eddy工具解决EPI形变问题,包括数据采集要点、参数设置和实战操作步骤。通过AP/PA双编码数据和精确的形变场估计,有效矫正MRI图像中的几何畸变,提升弥散数据质量。特别适合需要处理高场强MRI数据的研究人员和技术人员。

weixin_28725949的博客 401

Windows上python的spark环境搭建

1.安装好JDK 下载并安装好jdk-12.0.1_windows-x64_bin.exe,配置环境变量: 新建系统变量JAVA_HOME,值为Java安装路径 新建系统变量CLASSPATH,值为 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(注意最前面的圆点) 配置系统变量PATH,添加 %JAVA_HOME%bin;%JAVA_HOME%jrebin 在CMD中输入:java或者java -version,不显示不是内部命令等,说明安装成功。

weixin_43915303的博客 652

字符串匹配——KMP算法

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

哦豁灬 2万+

从零构建OpenBMC风扇控制:基于phosphor-pid-control的实战配置指南

本文详细介绍了如何从零开始构建OpenBMC风扇控制系统,基于phosphor-pid-control框架实现风扇自动调速。通过解析PID算法配置、传感器定义及控制区域设置,提供工业级散热解决方案,帮助开发者优化服务器能效与可靠性。

weixin_29263201的博客 748

字符串匹配算法之KMP

目录需求基础知识逻辑解析源码实现 需求 先简单描述溪源曾经遇到的需求: 需求一:项目结果文件中实验结论可能会存在未知类型、转换错误、空指针、超过索引长度等等。这里是类比需求,用日常开发中常出现的错误类型作为需求,如果要以上结论则判断这个项目检测失败; 解决方案一: 大家常用的方式可能是if(){continue;} esle if (){continue;} …或者switch-case等; 方案二:可能会使用集合contain()方法; 方案三:依次匹配字符串中字符(暴力匹配); 以上两种方案都能解决;然

增量星球 4812

微信小程序音视频通话(for硬件)授权与设备注册实战指南

本文详细介绍了微信小程序音视频通话(for硬件)组件的开发实践,涵盖授权流程、设备注册与VoIP插件集成。重点解析了如何通过服务端获取snTicket实现用户授权,确保硬件设备与微信端的音视频通话安全可靠,适用于智能门禁、话机等物联网场景。

u6v7w8x的博客 945

中小团队必看!用Harbor+Jenkins打造轻量级K3S交付流水线(含成本优化方案)

本文为中小团队详细介绍了如何利用K3S、Harbor与Jenkins构建一套高性价比的自动化交付流水线。内容涵盖单节点K3S集群的效能配置、Harbor镜像仓库的磁盘空间优化、Jenkins共享库实现流水线复用,并提供了完整的实战案例与成本优化方案,帮助团队以较低成本快速落地高效的自动化部署。

weixin_29223603的博客 504

字符串匹配——KMP算法【C语言】

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) 一、暴力算法 int BF(char *chang,char *duan) { int c_strlen=strle...

weixin_45423515的博客 7465

产品缺陷检测:表面缺陷检测_(1).产品缺陷检测基础理论

确定像素之间的相似性准则,如灰度值的差异。

zhubeibei168的博客 832

字符串匹配—KMP算法

这种类型字符串题目都可以采用暴力解法,套两层for循环也可以实现,但是时间复杂度太大,采用KMP算法之后,时间复杂度更低。所以掌握KMP算法还是有意义的

Hhjhj255的博客 872

YOLOv11改进策略【SPPF】| 将特征金字塔池化修改为:SPPCSPC,提升模型的特征提取能力和计算效率。

本文记录的是。YOLOv7中的SPPCSPC(Spatial Pyramid Pooling Cross Stage Partial Connections)模块是一种结合了(SPP)和(CSP)的改进结构,本文将其添加到YOLOv11中,

Limiiiing的博客 1822

C++从入门到进阶的系列书籍推荐(22本书)

要多读书,读好书!一本书要多读几遍才好,每次都可能有新的收获!特别在是有一定的工作年限和工作经验之后!读书百遍,其义自见! 下面就给大家推荐一下C++程序员进阶需要读的经典书籍: 1、C++入门书籍 C++是在C语言的基础上发展而来的,要学习C++之前需要先学习C语言。有了C语言基础之后再去学习C++。 1.1、C语言程序设计(谭浩强) 该书被公认为学习C语言程序设计的优秀教材,被全国大多数高校选用,是学习C语言的主流用书。本书比较通俗易懂,是初入者必备的书籍。 ........

dvlinker的技术专栏 4万+

字符串匹配算法KMP详解

本人是普通本科院校的一名大二学生,为提高自身能力特地锻炼自己发表一些文章,题解等, 望各位大佬能够对我这个菜鸟所做多多指正,在此谢过各位啦~~~ 文章的开始,我想向KMP算法的三位创始人Knuth,Morris,Pratt致敬,如此思维之精妙,堪称大神。 KMP算法是字符串匹配算法中一个很重要的算法,KMP算法的作用是在一个字符串中寻找子串的位置,也叫串的模式匹配。如主串s="aaabbaab",子串t(也叫模板串)="aab",要寻找aab在主串中的位置。 字符串匹配的暴力做法就是分别将两个指针i,

qq_51502732的博客 4659

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

KMP 字符串匹配算法

都说KMP算法难,我说KMP算法真不难,不信你点进来看看。

qq_63943454的博客 1062

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

pscad IEEE标准系统搭建说明

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

Java用KMP算法解决字符串匹配问题

14.4 KMP 算法 14.4.1 应用场景-字符串匹配问题 字符串匹配问题: 有一个字符串 str1= “迪丽热巴 迪丽热巴你你好 迪丽迪丽热巴迪丽热巴你好”,和一个子串 str2=“迪丽热巴你好” 现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1 先看一下暴力匹配法(不是KMP算法,用暴力匹配和KMP算法做对比) 如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有: 如果当前字符匹配成功(即 s

当一个合格的软件工程师 2746

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

字符串匹配--KMP算法

KMP算法是一种高效的字符串匹配算法,通过利用已匹配部分的信息避免不必要的回溯。其核心是构建next数组,记录模式串的最长公共前后缀,从而在匹配失败时快速调整模式串位置。相比暴力匹配O(n*m)的时间复杂度,KMP算法优化至O(n+m)。实现包括两部分:1)计算next数组;2)利用next数组进行匹配。虽然原理复杂,但掌握后能显著提升字符串处理效率。学习时建议理解算法逻辑而非死记模板,通过手动演算加深理解。该算法在编程竞赛中应用广泛,值得深入学习。

m0_65384516的博客 757

浅谈字符串匹配算法—BF算法及KMP算法

字符串匹配,在实际编程中经常遇到。其相应的算法有很多,本文就BF算法和KMP算法,谈一下自己的理解。并结合平时编程,修改了一下,使其更符合我们的使用习惯。(注:标准BF算法和KMP算法,为研究方便,其字符数组[0]存放的都是字符串的长度。本文讲解中,并没有保存字符串长度。后面给出的示例代码中,字符数组中是否保存有字符串长度,都给出了相应的算法代码。) 一、BF算法(Brute Force):

一个程序猿的故事 8285

字符串匹配算法——暴力匹配算法、KMP算法

1) KMP 是一个解决模式串在文本串是否出现过,如果出现过,获取最早出现的位置。2) Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的出现位置,这个算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发。3) KMP 算法:利用之前判断过信息,通过一个next 数组。

weixin_43713707的博客 1541

【算法】字符串匹配之KMP算法

对于字符串匹配,暴力法是对每个位置进行逐位匹配,只要有匹配失败的,就从待匹配串的下个位置开始从头匹配,这样的时间复杂度是O(MN)。 KMP算法能解决这样效率低下匹配,其核心思想是保留已匹配的前缀和,避免重复匹配,时间复杂度是O(M+N)。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较。因为B与A

Steven_L_的博客 2656

字符串匹配算法(KMP)

问题: 给你两个字符串 s和 pat ,请你在 s 字符串中找出 pat 字符串出现的第一个位置(下标从 0 开始),如果不存在则返回-1。 1.暴力匹配算法。 暴力匹配算法较好理解,其大致原理如图: 当D和E不匹配的时候,pat模式串会向右移动一位,然后继续匹配。 一直这样匹配,直到匹配到模式串或者匹配不成功为止。 代码如下: class Solution { public stat...

m0_61799623的博客 2799

字符串匹配KMP算法

新年第一篇博客也是第一次写关于算法的博客。这两天帮同学看《算法与数据结构》试题,其中涉及到字符串匹配KMP算法,借机重新温习整理了一下,也算有了新的体会与感悟,希望能够讲得清楚。 从字符串匹配讲起 我们都说KMP算法是一种高效的字符串匹配算法,所以首先先定义下字符串匹配问题:给定一个文本串T(也叫主串S),和一个模式串P,现在要找出S中与P匹配的子串,如果存在就返回匹配位置,否则返回-1。 暴力...

zxhohai的博客 1549

字符串匹配——KMP算法讲解

KMP算法讲解

Dirty_artist的博客 1024
上一篇: 背包问题
下一篇: leetcode 233 Number of Digit One
HelloCooper
博客等级 码龄11年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值