字符串匹配:kmp,bm和sunday算法

1.KMP算法

先了解一下KMP的核心,跳转表:
跳转表是对于模式字符串而言,即你需要在目标字符串匹配到的内容。

例如你想在ababdbccbababcd中匹配到baba,那么baba就是模式字符串。
下面介绍跳转表的实现方法:
跳转表的匹配是匹配前后缀,匹配目标是永远从第一个字符开始的字符串的字串,例如baba这个字符串:

匹配目标前缀后缀跳转值
baba0
babb,bab,ab1

可以看出前缀和后缀永远是从左到右有序的。

跳转表的使用:
在匹配时:
ababdbccbababcd
baba
无匹配,往后移动一位
ababdbccbababcd
 baba
匹配到三个,第四个a无匹配,然后去找含有三个元素子串的对应值,其对应值为1,即向后移(长度-对应值个)单位,即移两个单位,这个原理是我们运用已匹配的数据,比如例子中的bab,因为我们已经知道了这三个已经匹配到绝对不会全是我们需要的,然后我们通过前面的匹配知道了b是重复元素,那么我们可以利用后面这个已经匹配的b来加速我们的判断过程。

2.BM算法

BM算法不仅比KMP简单,而且具有更高的效率。
BM算法的核心在于从后向前匹配以及不包含项目的快速跳转。
还是以KMP中的例子为例介绍BM算法,我们想在ababdbccbababcd中匹配到baba。
先将两个字符串对其,得:
ababdbccbababcd
baba
从后往前匹配时,我们发现最后一个就已经不匹配了,我们将其往后移一位,得:
ababdbccbababcd
 baba
发现最后一个仍然不匹配,并且d不在我们的模式串里,那么我们可以直接后移一个模式串的距离。

3.Sunday算法

有了前两个的基础,sunday算法也很好理解

还是以KMP中的例子为例,我们想在ababdbccbababcd中匹配到baba。
先将两个字符串对齐,得:
ababdbccbababcd
baba
从前向后匹配,我们发现并不匹配,然后找不匹配部分的下一个字符,即d字符,然后发现d不在模式串中,那我们直接往后移动一个模式串+1的距离,即:
ababdbccbababcd
          baba
然后从前向后匹配,发现第二个不匹配,这时候找到不匹配部分的下一个字符,即a,然后将模式串里的a和其对齐,注意模式串是从后向前扫描的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值