BM算法根据两个判据来进行字符串匹配,分别是“坏字符规则”和‘好后缀规则",其中好后缀规则可以单独使用,算法的图解可以参照下面这篇博文:

https://www.cnblogs.com/wxgblogs/p/5701101.html

采用Python语言对BM算法进行实现,实现过程分为3个函数,主循环函数和两个判据的数组生成函数。

 def my_BM(t,p):
'''bm算法的自我实现,在t串中匹配p串,从模式串的尾部开始匹配'''
'''需要坏字符数组badchar[]和好后缀数组goodsuffix[]
每次失配后,根据两判据中最大的值移动p串,比较指针移动至最后'''
BadChar=BClist(p)
GoodSuffix=GSlist(p)
tlen,plen=len(t),len(p)
if tlen<plen:
return -1
i,k=plen-1,plen-1 #从p串尾部开始比较
move=0
while i<tlen and k>=0:
if t[i]==p[k]:
i,k=i-1,k-1
else:
BCmove=k-BadChar[ord(t[i])] if BadChar[ord(t[i])]!=-1 else plen
move=max(GoodSuffix[k],BCmove) #滑动位数
i,k=i+move+plen-1-k,plen-1
if k<=0:
return i+1
return -1 def BClist(p):
'''产生坏字符的失配移动表
j处失配,p串整体右移j-bc[T[j]]位'''
bc=[-1]*128 #标准ACCII表,可显示128个常用字符
plen=len(p)
for i in range(plen):
bc[ord(p[i])]=i #利用ord--chr函数的互相转化,间接直接将字符作为下标
return bc def GSlist(p):
'''产生好后缀方法的失配移动表,若i处失配,则分三种:相应地跳过字符个数逐渐变大
1. 已匹配成功的字符串形成的后缀gs,在p串中x存在相等的子串,则将p串右移i-x+1;
2. 条件1不成立,则在p的前缀中寻找gs的后缀相等的最大串,设后缀头在j,这一步类似于kmp的寻找最大相等前后缀,将p串右移j位;
3. 条件1,2都不成立,本轮比较失败,将p串整体移动p长度m'''
plen=len(p)
GS=[plen]*plen #初始化数组,并直接置于条件3的值
GS[plen-1]=1 #好后缀规则可以单独使用,它是基于已匹配的字符进行优化跳过,若首次匹配就失败,则应该只移动p串一位
for i in range(plen-1): #i处失配
#条件2,求i之后的后缀串,其在p串前缀中的最大相等前缀
#虽然也是求最大相等前后缀,但与kmp不同,kmp求的是前缀子串中的最大相等前后缀,而好后缀算法中求的是整个p串的最大相等前后缀,只是对该前后缀的长度做了限制
k=0
j=i+1
while j<plen:
if p[k]==p[j]:
k,j=k+1,j+1
else:
j=j-k+1
k=0
if k!=0:
GS[i]=plen-1-k
#搜寻p串中是否还有与p[i+1:]相等的子串,即条件1
substr=find_last(p[:plen-1],p[i+1:]) #find_last(t,p)函数寻找t串中最后一个p串的起始位置,若没有则返回-1
if substr!=-1:
GS[i]=i-substr+1
return GS

Boyer-Moore字符串搜索(BM算法)的Python实现的更多相关文章

  1. Boyer–Moore (BM)字符串搜索算法

    在计算机科学里,Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法.它由Bob Boyer和J Strother Moore设计于1977年.此算法仅对搜索目标字符串(关键字)进行预处 ...

  2. 字符串与模式匹配算法(四):BM算法

    一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...

  3. 字符串匹配算法之BM算法

    BM算法,全称是Boyer-Moore算法,1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法. BM算法定义了两个规则: ...

  4. 字符串匹配算法之 kmp算法 (python版)

    字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...

  5. hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)

    基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...

  6. 【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法

    字符串搜索中,BFS算法很巧妙,个人认为BFS算法效率是最高的. [StringSearch]就是根据BFS算法并优化. 使用方法: string s = "中国|国人|zg人|fuck|a ...

  7. 对《禁忌搜索(Tabu Search)算法及python实现》的修改

    这个算法是在听北大人工智能mooc的时候,老师讲的一种局部搜索算法,可是举得例子不太明白.搜索网页后,发现<禁忌搜索(Tabu Search)算法及python实现>(https://bl ...

  8. LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他

    LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...

  9. LeetCode初级算法的Python实现--字符串

    LeetCode初级算法的Python实现--字符串 # 反转字符串 def reverseString(s): return s[::-1] # 颠倒数字 def reverse(x): if x ...

随机推荐

  1. 解决vue在控制台的 NavigationDuplicated 报错

    解决问题: 点击相同的链接,会有一个重复key的报错 const originalPush = Router.prototype.push Router.prototype.push = functi ...

  2. Flask wtforms 表单验证使用

    目录 wtforms 使用1(简单版): 使用2(复杂版): wtforms 安装:pip3 install wtforms 使用1(简单版): from flask import Flask, re ...

  3. SpringBoot AOP处理请求日志处理打印

    SpringBoot AOP处理请求日志处理打印 @Slf4j @Aspect @Configuration public class RequestAopConfig { @Autowired pr ...

  4. QQ小程序支付

    QQ小程序支付 Java后端 同学折腾QQ小程序的支付折腾了好几天,没有完成统一下单,因为我做过微信和支付宝支付,他就让我帮忙搞 我搞了好两三个小时,也没搞出来,最终我觉得问题在商户key那里,问了几 ...

  5. Vue中使用axios发送ajax请求

    作为前后端交互的重要技巧--发送ajax请求,在Vue中我们使用axio来完成这一需求: 首先是下载axios的依赖, npm install --save axios vue-axios 然后在ma ...

  6. hdu2612 又是迷宫系列

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2612/ 题意:有两个人在地图上不同的位置,地图上由若干个餐厅,求两人能同时到达一个餐厅所用最少的总时间. 代码如 ...

  7. Javascript之网页版待办事项

    本文使用原生JS实现站点 http://www.todolist.cn/ 的基本功能. 其中页面的HTML布局和CSS样式取用原站,JS部分为自己编写. 效果图 完整代码 HTML.JS部分 < ...

  8. MySQL数据库参数调优方法

    怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据 ...

  9. TensorFlow 一步一步实现卷积神经网络

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! TensorFlow 从入门到精通系列教程: http://www ...

  10. coding++ :JS-判断当前是否是IE浏览器,并返回时IE几?

    IEVersion(); function IEVersion() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 var is ...