前言
文章的一开头,还是要强调下字符串匹配的思路:将模式串和主串进行比较从前往后比较
从后往前比较
匹配时,比较主串和模式串的下一个位置
失配时,在模式串中寻觅一个合适的位置假如找到,从这个位置开始与主串当前失配位置进行比较
假如未找到,从模式串的头部与主串失配位置的下一个位置进行比较
在主串中找到一个合适的位置,重新与模式串进行比较
前面的 BF 和 KMP 算法,都是属于规规矩矩从前向后的操作,后者仅在寻觅模式串的合适位置上进行了优化,而 BM 算法的操作就显得骚了很多,它的优化点在于:从后往前比较
失配时,寻觅的是主串中合适的位置
算法详情与分析
关于算法的详情和分析,网上有很多解释,这里推荐一下阮一峰的字符串匹配的Boyer-Moore算法,很清楚的讲解了整个优化的思路,可以先看完了解了再往下看,由于下面主要详情一下坏字符规则和好后缀规则需要的数据结构的手工求法以及代码实现。
坏字符规则
运用坏字符规则,在算法里主要表现在生成一张散列表,表的key值是字符集里每个字符的ASCII码值,value值是模式串中该字符的位置,举个栗子:
QQ20200119-202854.png
假设字符串的字符集不是很大,用长度为256的数组来存储ÿ