KPM算法

news2024/11/18 15:45:53

在这里插入图片描述

概念

KMP(Knuth–Morris–Pratt)算法是一种字符串匹配算法,用于在一个主文本字符串中查找一个模式字符串的出现位置。KMP算法通过利用模式字符串中的重复性,避免无意义的字符比较,从而提高效率。

KMP算法的核心思想是构建一个部分匹配表(Pi表),保存了模式字符串中每个位置的最长公共前后缀的长度。通过Pi表,在匹配过程中,当遇到不匹配的字符时,可以根据Pi表中的信息,跳过一部分不可能匹配的区域,从而减少比较次数。

KMP算法的时间复杂度是O(m + n),其中m为模式字符串的长度,n为主文本字符串的长度。相比于朴素的字符串匹配算法的时间复杂度O(m * n),KMP算法具有较高的效率。

作用:

KMP算法的主要作用是在一个文本串(主串)中查找一个模式串的出现位置。具体来说,KMP算法可以解决以下问题:

  1. 字符串匹配:给定一个文本串和一个模式串,判断模式串是否在文本串中出现,如果是,返回模式串的起始位置。

  2. 子串查找:给定一个文本串和一个模式串,找到模式串在文本串中第一次出现的位置。

  3. 字符串搜索:在一个文本串中查找包含指定关键字的子串。

  4. 字符串替换:在一个文本串中查找并替换指定的模式串。

  5. 字符串压缩:将文本串中重复出现的模式串进行压缩,并返回压缩后的结果。

总而言之,KMP算法可以帮助我们高效地处理字符串匹配和搜索问题,减少不必要的比较和回溯操作,提高算法的效率和性能。它在文本处理、搜索引擎、编译器等领域有着广泛的应用。

应用场景

KMP算法在字符串匹配和搜索领域有广泛的应用场景,包括但不限于以下几个方面:

  1. 文本搜索引擎:KMP算法可以用于实现关键字的搜索和匹配,例如在搜索引擎中根据输入的关键字在文本库中进行快速匹配和搜索。

  2. 文件编辑器和IDE:KMP算法可以用于文件编辑器和集成开发环境(IDE)中的字符串搜索和替换功能,帮助用户快速定位和修改指定的字符串。

  3. 字符串查找和过滤:KMP算法可以应用于字符串的快速查找和过滤,比如在大量数据中查找匹配某种模式的字符串,或者过滤掉不符合某种模式的字符串。

  4. 数据压缩和编码:KMP算法在数据压缩和编码中也有应用,例如在字符串压缩算法中,可以利用KMP算法找到重复的模式串并进行压缩处理。

  5. 字符串分析和语法分析:KMP算法可以用于字符串分析和语法分析过程中的模式匹配和文本解析,帮助识别和解析特定的语法结构和模式。

总之,KMP算法适用于需要进行高效的字符串匹配和搜索的应用场景,特别是当处理大量文本数据时,能够有效提高算法的效率和性能。

练习题:

28. 找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

示例 1:
输入:haystack = “sadbutsad”, needle = “sad” 输出:0 解释:“sad” 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:
输入:haystack = “leetcode”, needle = “leeto” 输出:-1 解释:“leeto” 没有在
“leetcode” 中出现,所以返回 -1 。

提示:
1 <= haystack.length, needle.length <= 104 haystack 和 needle
仅由小写英文字符组成

暴力解法

class Solution {
public:
    int strStr(string haystack, string needle) {
        int len1=haystack.size();
        int len2=needle.size();
        int i=0,j=0;
        while(i<len1 && j<len2){
            if(haystack[i]==needle[j]){
                ++i,++j;
                if(j==len2)
                    return i-j;
            }else{
                i=i-j+1;
                j=0;
            }
        }
        return -1;
    }
};

KMP

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;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1011693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【持续记录】深度学习环境配置

1080面对Transformer连勉强也算不上了&#xff0c;还是要去用小组公用的卡 完整记一个环境配置&#xff0c;方便后面自用✍️ nvidia-smi查看GPU信息 ** CUDA版本12.2 conda -V查询conda版本 22.9.0 新建conda环境 准备装python3.8 conda create --name caiman python3.8.2激…

Apollo自动驾驶平台的未来展望:从智能出行到城市管理

引言&#xff1a; 自动驾驶技术已经从科幻概念变为现实&#xff0c;而Baidu的Apollo自动驾驶平台正处于这一技术浪潮的前沿。但Apollo的潜力远远不止于此&#xff0c;它有可能引领整个城市的未来发展。本文将探讨Apollo自动驾驶平台在未来的展望&#xff0c;从智能出行到城市管…

VS Code用AI写代码:Codeium插件

文章目录 Codeiumchat代码生成 Codeium Codeium是基于边缘计算的代码AI工具&#xff0c;提供超过70种编程语言的代码补全、对话、搜索等功能&#xff0c;相当霸道。 在插件栏搜索到Codeium之后&#xff0c;需要科学上网安装&#xff0c;安装完成后会提示注册。注册之后&#…

这应该是Linux用户与用户组最详细的知识了吧!

【微|信|公|众|号&#xff1a;厦门微思网络】 Linux学习专栏​ 1、用户和用户组文件 在 linux 中&#xff0c;用户帐号&#xff0c;用户密码&#xff0c;用户组信息和用户组密码均是存放在不同的配置文件中的。 在 linux 系统中&#xff0c;所创建的用户帐号和其相关信息 (密…

考虑可再生能源消纳的建筑综合能源系统日前经济调度模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于智能远程监考方案,云上组考打造考试新范式

热潮兴起&#xff0c;「云上组考」是怎样炼成的&#xff1f; 疫情以来&#xff0c;改变了很多场景形态&#xff0c;“考试”是其中之一。 越来越多的学校开始采用云上组考模式&#xff0c;提高考试效率&#xff0c;节省人力、物力成本&#xff0c;规范考试管理&#xff0c;引发…

掌握Linux服务器:构建、管理和优化稳健的互联网基础设施

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 Linux服务器是构建…

基于SpringBoot+Vue+MySQL实现的高校固定资产管理系统源代码+数据库

基于 Vue 和 SpringBoot 的高校固定资产管理系统 完整代码下载地址&#xff1a;高校固定资产管理系统 软件简介 基于 Vue 和 SpringBoot 的高校固定资产管理系统&#xff0c;用于实现高校对固定资产的管理需求&#xff0c;包含资产品类、资产单位、资产仓库、资产供应商、资…

分布式文件系统的新兴力量:揭秘Alluxio的元数据管理机制【文末送书】

文章目录 写在前面01 分布式文件系统元数据的常见类型1.1 文件&#xff08;inode&#xff09;元数据1.2 数据块&#xff08;block&#xff09;元数据1.3 Worker元数据 02 分布式文件系统元数据的存储模式2.1 元数据存储在堆上&#xff08;HEAP模式&#xff09;2.2 元数据存储在…

智安网络|提升企业网络安全:避免成为勒索软件攻击的目标

勒索软件是当前网络世界中一种威胁严峻的恶意软件类型&#xff0c;勒索软件攻击近年来不断增加&#xff0c;越来越多的企业成为勒索软件攻击的目标。这种攻击方式通过加密敏感数据&#xff0c;并勒索企业支付赎金以解锁数据&#xff0c;给企业造成严重的经济损失与声誉风险。企…

GDB之call、print手动调用函数(十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

SSM - Springboot - MyBatis-Plus 全栈体系(八)

第二章 SpringFramework 四、SpringIoC 实践和应用 4. 基于 配置类 方式管理 Bean 4.4 实验三&#xff1a;高级特性&#xff1a;Bean 注解细节 4.4.1 Bean 生成 BeanName 问题 Bean 注解源码&#xff1a; public interface Bean {//前两个注解可以指定Bean的标识AliasFor…

【计算机视觉 | 图像模型】常见的计算机视觉 image model(CNNs Transformers) 的介绍合集(六)

文章目录 一、Co-Scale Conv-attentional Image Transformer&#xff08;CoaT&#xff09;二、Pyramid Vision Transformer v2(PVTv2)三、Class-Attention in Image Transformers&#xff08;CaiT&#xff09;四、PoolFormer五、ScaleNet六、VoVNet七、Siamese U-Net八、Single…

MT4和MT5的共同点,anzo capital昂首资本说一个,没人有意见吧

相信很多交易者对MT4和MT5都不会陌生&#xff0c;但您了解他们背后之间的关系吗?今天anzo capital昂首资本就和各位交易者一起聊聊&#xff0c;没人有意见的MT4和MT5的共同点。 其实谈起MT4和MT5&#xff0c;就不得不聊聊他们背后的公司MetaQuotes&#xff0c;MetaQuotes 是…

家政小程序源码家政预约小程序独立版,家政上门预约,功能强大

家政服务行业作为一个相对传统的行业&#xff0c;随着互联网的发展迅速&#xff0c;和用户群体的改变&#xff0c;家政服务公司也需要改变一下经营思路了&#xff0c;否则未来很难满足新一代用户群体的个性化需求。 核心功能&#xff1a; 1、师傅(服务人员)入驻&#xff1a;家…

IDEA怎么将CRLF转化为LF

执行命令&#xff1a; git config --global core.autocrlf input 或者使用IDEA的自动提交的修复

2023 Google开发者大会:你了解机器学习的新动向吗?

目录 0 年度科技盛会1 生成式机器学习2 无障碍游戏体验3 跨平台机器学习总结 0 年度科技盛会 2023Google开发者大会在上海浦东举办&#xff0c;为开发者和科技爱好者们带来新技术、新产品、新动向 可能很多同学对Google 开发者大会还不熟悉&#xff0c;Google 开发者大会是 G…

异步FIFO设计

1 FIFO简介 FIFO的本质是RAM&#xff0c;具有先进先出的特性。 FIFO的基本使用原则&#xff1a;空时不能读&#xff0c;满时不能写 FIFO的两个重要参数&#xff1a;宽度和深度 FIFO的两种类型&#xff1a; 同步FIFO&#xff1a;读写时钟相同&#xff0c;通常用来做数据缓存…

医疗领域超低温监控,你了解吗?

超低温冰箱在医疗保健领域中扮演着不可或缺的角色。它们被广泛用于存储生物样本、药物和疫苗等温度敏感的医疗物品&#xff0c;以确保这些关键资源的质量和有效性。 然而&#xff0c;温度波动和不稳定性可能会对这些物品造成严重损害&#xff0c;甚至威胁患者的生命。为了应对这…

对话泛微:产业数字化时代,我们需要怎样的OA?

在泛微诞生以后的十年&#xff0c;恰是OA系统的大规模突破。十年间&#xff0c;上百家OA企业的诞生直接将市场推向了鼎盛期。而后又迎来了移动互联网风口&#xff0c;在互联网厂商的冲击之下&#xff0c;传统OA在不断进击的同时&#xff0c;还要进行自我蜕变&#xff0c;成为“…