关于KMP算法这个精英怪

本文介绍了KMP算法的核心思想,通过解析失配时的处理方式,探讨了最长相等前后缀的概念。文章详细讨论了next数组的生成,包括两种情况的分析,并给出了代码实现的思路。通过对KMP算法的数学解析,帮助读者深入理解其工作原理。
摘要由CSDN通过智能技术生成

在学习严奶奶的数据结构时,看到了关于KMP算法的推导过程,而在我重新开始走三位大神走过的道路时,遇到了很多的问题。这些问题在看了许多文章和视频后,并没有很好的解决,总觉得有一些疏漏的地方,所以我的理解写下来与大家分享,若有错误的地方请不留余地的指出来,不胜感激。

虽然可以有更好的方式来学会KMP,但我想如果可以的话,踩着巨人的脚步,想着当时他们是如何想到并逐步解决问题,或许会对我有很大的帮助。如何用数学来解决实际问题。接下来会是一堆符号与文字。

那现在开始,首先把书上的定义写出来。

主串为"s_{1}s_{2} ..... s_{n}",模式串为"t_{1}t_{2}.....t_{m}"。

一、 当主串中第i个字符与模式中的第j个字符“失配”时,主串中第i个字符应与模式串中哪个字符再比较? 

假设:应与第k个字符,则前面的k-1个字符须满足  

"t_{1}t_{2}.....t_{k-1}"="s_{i-k+1}s_{i-k+2}......s_{i-1}"   (1-1)

而在这里就是我疑惑的起点

这个式子的意思我是这样理解的:我们假若t从1移动到k,共移动了k-1个字符,t现在的位置为k,s所在的位置为i,我们可以得到

      ①  t 现在的位置 k 减去移动的k-1个字符就又回到了起点1

      ②  若s所在的位置 i 减去 k 所移动的k-1个字符 i-(k-1),则代表s回到与t首字符相对应的位置,(这里的回到并不是回溯),然后模式串k 之前的字符一一与主串 i 之前的k-1个字符相等。

而已经得到的"部分匹配"的结果是

"t_{j-k+1}t_{j-k+2}......t_{j-1}"="s_{i-k+1}s_{i-k+2}.......s_{i-1}"(1-2)

(这个真的是阻挠了我很久,最后我是这样理解的,也不知道对不对。)

我们列出如下字符串

a b a b c a b c a c   --->  i  主串

      a b c a c            --->  j  模式串    这是j与i “失配”所在的串

               a b c a c   ---> k           

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值