bm算法好后缀 java实现_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法...

前言

文章的一开头,还是要强调下字符串匹配的思路:将模式串和主串进行比较从前往后比较

从后往前比较

匹配时,比较主串和模式串的下一个位置

失配时,在模式串中寻觅一个合适的位置假如找到,从这个位置开始与主串当前失配位置进行比较

假如未找到,从模式串的头部与主串失配位置的下一个位置进行比较

在主串中找到一个合适的位置,重新与模式串进行比较

前面的 BF 和 KMP 算法,都是属于规规矩矩从前向后的操作,后者仅在寻觅模式串的合适位置上进行了优化,而 BM 算法的操作就显得骚了很多,它的优化点在于:从后往前比较

失配时,寻觅的是主串中合适的位置

算法详情与分析

关于算法的详情和分析,网上有很多解释,这里推荐一下阮一峰的字符串匹配的Boyer-Moore算法,很清楚的讲解了整个优化的思路,可以先看完了解了再往下看,由于下面主要详情一下坏字符规则和好后缀规则需要的数据结构的手工求法以及代码实现。

坏字符规则

运用坏字符规则,在算法里主要表现在生成一张散列表,表的key值是字符集里每个字符的ASCII码值,value值是模式串中该字符的位置,举个栗子:

435e43642d5908f6912f485909b31164.pngQQ20200119-202854.png

假设字符串的字符集不是很大,用长度为256的数组来存储ÿ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值