数据结构---KMP算法(2)

0.简介

KMP中有个next数组,我们从这里逐渐引出KMP算法原理。

1.最长公共前后缀

我们先看最长公共前后缀问题,给定一个字符串s,s为abcdabcd,问这个字符串的最长公共前后最是什么,我们能一眼就看出是abcd,因为abcd.....,和.....abcd,这样一来,就找到了。现在好好理解一下这个找最长公共前后缀问题。

首先,这是一个动态规划问题。假如当前字符串长度为n,那么当长度为n的时候,最长公共前后缀m是什么,取决于长度是n-1时候最长公共前后缀k是多少和第n个字符是否与第k+1个字符相等。如下图。dp[i]为到i为止,最长公共前后缀的长度。

 

上面的是一种情况,假如s[i]与s[dp[i-1]+1]不相等的时候呢。如下图

此时s[i]与s[dp[i-1]+1]不相等,我们就不能直接利用dp[i-1]的结果了。

但是怎么找开头与后面这段那个位置能最长匹配,从倒数第四个b开始挨个和字符串开头匹配?可以,但是不好。

不难发现,字符串后面的abab和开头的abab是一样的,此时问题就变成了求abab在填一个a变成ababa的最长公共前后缀,abab的最长公共前后缀已经在前面求过了,直接拿来结果就好了。也就是看dp[dp[i-1]]的值和s[dp[dp[i-1]]+1]是否与s[i]相等。如下图

如果还不相等,继续以此类推,直到无法计算,或者是相等为止。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值