首页 > 编程语言 >【学习笔记】KMP算法(字符串匹配优化算法)

【学习笔记】KMP算法(字符串匹配优化算法)

时间:2024-02-27 13:24:10浏览次数:41  
标签:匹配 后缀 str2 str1 算法 KMP 字符串

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。

KMP算法的作用是,在一个长字符串内匹配一个短字符串(判断str1.contains(str2))时,减少匹配的次数,提高匹配效率。


 

必要概念:最长公共前后缀

字符串“asdas”中,前缀有[a, as, asd, asda],后缀有[s, as, das, sdas],公共部分为[as],最长公共前后缀即为“as”(如果公共部分有多个,则取最长的一个)。

必要概念:Next数组

字符串asdas的所有左子串为[a, as, asd, asda, asdas],这些子串的最长公共前后缀的长度组成的数组[0, 0, 0, 1, 2],即为KMP算法所需的Next数组。


 

原始字符串匹配思路:

str1:asdmasdasb

str2:asdas

从str1的第0位、str2的第0位开始,向右一个字符一个字符比较,比较到第3位(m对a)时发现不匹配,则起始位置退回到str1第1位、str2的第0位,再次往后比较,以此类推。

 

KMP算法思路:

在比较中途发现不完全匹配时,不用退回到str1起始位置的下一位,而是直接接着str1当前位置,同时将str2的位置退回到当前已匹配子串的最长公共前后缀的下一位。

原理如下:

str1:zxzxzxcv

str2:zxzxc

从两者的第0位开始比较,一直比较到第4位(z对c)发现不匹配。

此时已匹配子串位zxzx,其最长公共前后缀为zx,长度为2。

str1接着在第4位(zxzx[z]xcv)的z,str2回退到第2位(zx[z]xc)中的z,继续往后一个一个比较。

在本例中,继续往后比较即可匹配成功zx[zxzxc]v。

如果再出现不匹配,重新根据已匹配子串进行回退即可。

Next数组的作用,则是在开始匹配之前,先一次性计算出str2的所有左子串的最长公共前后缀,在比较发现不匹配时,直接读取对应的数值,来回退到对应的位置即可。

 

标签:匹配,后缀,str2,str1,算法,KMP,字符串
From: https://www.cnblogs.com/AsrielMao/p/18036443

相关文章

  • 844. 比较含退格的字符串C
    这题学到了很多。malloc后要初始化。申请字符串要N+1个单位字符串以0结尾等等char*final(char*s,intn){char*tem=(char*)malloc(sizeof(char)*(n+1));for(inti=0;i<=n;i++){tem[i]=0;}intj=0;for(inti=0;i<n;i++){if(s[......
  • NLog条件配置——实现将包含某个特定字符串日志写入指定文件
    需求产生缘由在开发中为了了解程序在运行的内存状态并记录下来,以便出问题时判断是不是与内存相关。于是实时采集了开发程序需要的内存信息。但采集的内存信息在存储时,以NLog中的Trace级别来存储的话,会与程序其它Trace级别的日志都记录在相同的TraceLog文件下,这会导致在查看内存......
  • 逆向实战31——xhs—xs算法分析
    前言本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!公众号链接目标网站aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tLw==逆向分析打开网站这里eyj这种开头......
  • 视频汇聚平台智能边缘分析一体机视频监控汇聚平台算法识别检测区域入侵检测算法
    随着社会的不断发展,安全问题日益受到人们的关注。在各种公共场所,保障人员和财产安全成为当务之急。为了更好地应对安全挑战,视频监控技术发挥着越来越重要的作用。而今,视频汇聚平台智能边缘分析一体机区域入侵检测技术的问世,为安全防范带来了全新的可能性。视频汇聚平......
  • 代码随想录算法训练营第二十九天| 491.递增子序列 46.全排列 47.全排列 II
    491.递增子序列题目链接:491.非递减子序列-力扣(LeetCode)思路:一开始一直报访问异常的错误,最后只好参考官网答案,结果竟然是因为我递归参数写错了导致程序一直出问题???(⊙︿⊙)这里去重用的是标记数组,可以用集合unordered_set,但由于本题数据范围比较小,所以我们可以用数组更加高效的......
  • 【算法】关于最长递增子序列(LIS)二分+贪心解法
    前言我们都知道,解决LIS的常规解法为DP,时间复杂度为O(n^2),但是在一些条件苛刻的问题中,通常DP的解法会超时。那么,是否存在一种时间复杂度更优秀的解法呢?答案是肯定的,有一种二分加贪心的解法可以将时间复杂度降低为O(nlogn)。详解如果我们现在要求下面这一组数据的LIS:我们需......
  • 竞赛算法经典入门 .2
    //7744问题#include<stdio.h>#include<math.h>intmain(){for(inta=1;a<=9;a++)for(intb=1;b<=9;b++){intn=a*1100+b*11;intm=floor(sqrt(n)+0.5);//floor(x)函数,//也称为下取整函数或地板函数,//是一种数学函数,用......
  • 根号分治与莫队算法
    1.根号分治与分块在预处理与询问的复杂度之间寻找平衡的一个算法,通常以根号为分界线。属于智慧的暴力。1.1.根号平衡使用数学不等式对于阈值取一个值,使得复杂度最优。如果有阈值\(B\),若问题有一部分暴力可以\(O(B)\)解决,另一部分可以\(O(\frac{n}{B})\)解决。那么根据基......
  • 【算法】【字符串】无重复字符的最长子串
    1 题目给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子字符串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子字符串是"b......
  • 反转字符串
    思路1、建立双指针,一个指最前的元素,一个指最后的元素。将它们两两交换设长度是n,反转可以看成s[0]=s[n-1],top指针指向s[0],end指针指向s[n-1],交换完毕后,top指针++,end指针--,交换s[1]=s[n-2],依次推类。结束循环的条件:如果n是奇数,循环的条件为top=end=n/2如果n是偶数,最后......