KMP算法-超级无敌详细(嚼碎了喂你)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、朴素的模式匹配算法(BF暴力匹配算法)二、KMP算法1.next[]数组求法2.next[j]数组代码分析总结前言提示:这里可以添加本文要记录的大概内容:记录KMP算法学习思路:之后用到的主串S和子串T中的S[0]和T[0]存储的是该字符串的长度,S[1]和T[1]存储的才是当前字符串的第一个元素。提示:以下是本篇文章正文内容,下面案例可供参考一、朴素的模式匹配算法(BF暴力匹配算法)有一主串S、子串T,.
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

记录KMP算法学习思路:
之后用到的主串S和子串T中的S[0]和T[0]存储的是该字符串的长度,S[1]和T[1]存储的才是当前字符串的第一个元素。


提示:以下是本篇文章正文内容,下面案例可供参考

一、朴素的模式匹配算法(BF暴力匹配算法)

有一主串S、子串T,返回在S中和T完全相同时的index。在朴素的模式匹配算法(BF暴力匹配算法)中是:简单来说就是:从主串s 和子串t 的第一个字符开始,将两字符串的字符一一比对,如果出现某个字符不匹配,主串回溯到第二个字符,子串回溯到第一个字符再进行一一比对。如果出现某个字符不匹配,主串回溯到第三个字符,子串回溯到第一个字符再进行一一比对…一直到子串字符全部匹配成功。

图片来看更容易理解:
竖直线表示相等,闪电线表示不等
第一个过程:子串“goo”部分与主串相等,'g’不等,结束比对,进行回溯。
在这里插入图片描述
第二个过程:开始时就不匹配,直接回溯
在这里插入图片描述
第三个过程:开始时即不匹配,直接回溯

在这里插入图片描述
第四个过程:开始时即不匹配,直接回溯
在这里插入图片描述
第五个过程:匹配成功
在这里插入图片描述
这种算法在最好情况下时间复杂度为O(n)。即子串的n个字符正好等于主串的前n个字符,而最坏的情况下时间复杂度为O(m*n)。

二、KMP算法

搞清楚KMP算法前,先用图片搞清楚KMP算法好在哪里:
在此之前插入一个概念:
前缀:包含第一个字符,但是不包含最后一个字符
后缀:包含最后一个字符,但是不包含第一个字符

现在我们先看一个图:第一个长条代表主串,第二个长条代表子串。红色部分代表两串中已匹配的部分,
绿色和蓝色部分分别代表主串和子串中不匹配的字符。
再具体一些:这个图代表主串"abcabeabcabcmn"和子串"abcabcmn"。
第一张图:
在这里插入图片描述在这里插入图片描述
现在发现了不匹配的地方,根据KMP的思想我们要将子串向后移动,现在解决要移动多少的问题。
之前提到的最长相等前后缀的概念有用处了。因为红色部分也会有最长相等前后缀。

第二张图:
在这里插入图片描述在这里插入图片描述
灰色部分就是红色部分字符串的最长相等前后缀,我们子串移动的结果就是让子串的红色部分最长相等前缀和主串红色部分最长相等后缀对齐。

第三张图:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值