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. 深入理解计算机系统 (CS:APP) 缓冲区漏洞实验 – Buffer Lab 解析

    原文地址:https://billc.io/2019/05/csapp-cachelab/ 写在前面 这是 CSAPP 官网上的第 4 个实验 buflab,也是学校要求的第三个实验.这个实验比上一个 ...

  2. Python基础篇_实例练习1

    1.逢7跳过小游戏:从1-100之间,遇到带7的数字或者7的倍数跳过. for i in range(1,101): if i == 7 or i % 10 == 7 or i // 10 == 7: ...

  3. Python习题集(三)

    每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 写一个小程序:控制 ...

  4. CF57C Array

    题目传送门 题目大意(摘自洛谷) 描述 对于长度为n的数组A,A中只包含从1到n的整数(可重复).如果A单调不上升或单调不下降,A就可称为美丽的. 找出在长度为n时,有几个美丽的A. 输入 一个整数n ...

  5. CSS实现垂直居中布局

    垂直居中 每日更新前端基础,如果觉得不错,点个star吧

  6. masql数据库的表查询

    昨日回顾 表与表之间建关系 一对多 换位思考 图书与出版社 先站在左表: 考虑左表的多条数据能否对应右表的一条数据 翻译:多本书能否被一个出版社出版 可以! 注意:单站在一张得出的表关系并不能明确两张 ...

  7. 插了带蠕虫的U盘后,文件不见了怎么快速恢复

    朋友插了别人U盘,电脑中毒,找到我,在网上找了一些教程,好多都是用杀软的,懒的下,亲测本教程简单有效 首先,我们创建了一个reg文件(注册表文件),如下, 利用REG文件我们可以直接对注册表进行任何修 ...

  8. hdu1253胜利大逃亡(城堡的怪物太狠,主角难免天天逃亡)

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1253/ 其实就是二维扩展到三维了,增加了搜索方向,其他的没什么不同. 代码如下: #include<bit ...

  9. 朴素贝叶斯分类器(Naive Bayesian Classifier)

    本博客是基于对周志华教授所著的<机器学习>的"第7章 贝叶斯分类器"部分内容的学习笔记. 朴素贝叶斯分类器,顾名思义,是一种分类算法,且借助了贝叶斯定理.另外,它是一种 ...

  10. [React]核心概念

    本文是对React文档:核心概念部分的笔记,内容大致与文档相同. 文档链接 React哲学部分写的很好,务必要看 JSX JSX是JS的语法扩展,配合react使用,为JS和HTML的混写 JSX支持 ...