KMP算法

最近看opencv的模板匹配,意外搜到kmp算法(字符串模板匹配算法),就看了下,现在予以记录,以备后面回顾学习。

先做概念及测试用例:

前缀:abcd的前缀有a,ab,abc。

后缀:abcd的后缀有d,cd,bcd。

A串:a c a b c a a b a b c d a b(匹配串)

B串:a b c a a b c a a c a b(模板串)

kmp算法核心next数组,以下是B串手动模拟的next[]:

 0 1 2 3 4 5 6 7 8 9 10 11

    a b c a a b c a a c  a   b

-1 0 0 0 1 1 2 3 4 5 0 1   2

kmp算法本人粗见如下:

字符串的朴素匹配是将B串与A串比较,若不匹配就将A串后移一个继续比较,这样做很好理解,却放弃了很多可以提高效率的已知信息,如下

A串:a c a b c a a b a b c d a b

B串:      a b c a a b c a a c a b

以上匹配我们已知B串与A串匹配前6个字符,下一步匹配也就知道了A.at(2)到A.at(7)字符,那我们为什么还要死板的从A串的第A.at(3)字符重新比较。

所以kmp算法的next数组就是将这些信息利用起来,得到下一次匹配A串的位子,而不是单纯的+1。

如上的例子,根据kmp下一次比较A串的坐标为:2+6-2=6(当前坐标+匹配字符数-对应next[]的值),所以从A.at(6)开始匹配。

下面说说next[]数组的计算

next值为匹配的字符串的(前缀==后缀)的最大值,如abcaab的next值计算

(前缀:a,ab,abc,abca,abcaa==后缀:b,ab,aab,caab,bcaab)为ab所以为2。

 

转载于:https://www.cnblogs.com/zhough/p/7196316.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值