![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S21a248-70.png)
文章插图
此外,若在模式串中若存在多个与好后缀匹配的相同字符串或与好后缀的后缀字串相同的模式串中的前缀子串,则选择最长且靠后的串并记为 { v },按规则滑动 。
以上就是BM算法的两个核心规则 , 在使用中可以分别计算好使用两用规则的滑动位数,取较大的一个 max( k1, k2 ) , 作为向后滑动的位数 , 这样既能使得时间复杂度接近最优的O( n / m ) , 也能避免滑动位数出现负数的情况 。
具体实现如下:
(1)对于坏字符规则的计算 , 如果每次都去遍历那效率会很低 , 可以利用一个哈希表 , 存储每个字符在模式串中的位置 , 如果有多个相同字符,则取下标最大的一个 。如图:
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2191W1-71.png)
文章插图
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S21942b-72.png)
文章插图
(2)对于好后缀规则 , 其核心在于:在模式串中查找与好后缀匹配的子串;在好后缀的所有后缀字串中,查找能与模式串前缀子串匹配的最长子串 。
- 先来解决第一个问题,如何表示模式串中不同的后缀字串以及如何滑动到对应位置?
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S21962S-73.png)
文章插图
如果存在多个合法的子串,则取下标最大的一个 。
—— —— —— —— —— —— —— —— —— —— —— —— —— ——
- 找完了模式串中的所有子串,还有一个问题:查找在好后缀的所有后缀子串中,能与模式串前缀子串匹配的最长的一个后缀子串(以下记为 “最长可匹配后缀子串”)
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2192953-74.png)
文章插图
—— —— —— —— —— —— —— —— —— —— —— —— —— ——
- 接下来,理解并推导一下这两个数组的值
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S21934O-75.png)
文章插图
—— —— —— —— —— —— —— —— —— —— —— —— —— ——
- 最后来看一下,如何根据这两个数组计算出滑动的位数
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2195062-76.png)
文章插图
如果 suffix[ k ] = -1,说明模式串中不存在与好后缀匹配的子串 。此时,使用好后缀的另一条规则:查找好后缀中,所有后缀子串中 , 能与模式串前缀子串匹配的,最长的那一个后缀子串 。好后缀 pat[ j + 1, m – 1 ]的后缀子串 pat[ r, m – 1]( j + 2 <= r <= m – 1 )记作 { v },其长度 k = m – r 。若 prefix[ k ] = true,表示长度为 k 的后缀子串,存在可匹配的前缀子串 { v* },则将模式串移动 r 位 。如图:
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S219A48-77.png)
文章插图
如果在模式串中没有找到与好后缀可以匹配的前缀子串 , 也没有找到好后缀中可匹配模式串中前缀子串的,后缀子串,则将整个模式串后移 m 位 。如图:
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2195L2-78.png)
推荐阅读
- 【前端必会】不知道webpack插件? webpack插件源码分析BannerPlugin
- 20220929-ArrayList扩容机制源码分析
- Optional源码解析与实践
- Go 源码解读|如何用好 errors 库的 errors.Is 与 errors.As() 方法
- .Net下的分布式唯一ID
- .NET 反向代理 YARP 代理 GRPC
- 赞美父亲的作文结尾 赞美父亲的高中作文
- 关于对自己有信心的名言名语 对学习有信心的名言
- 关于父亲的高中作文800字 关于父亲的高中作文
- 高一化学全面学习方法整理