Boyer-Moore字符串搜索(BM算法)的Python实现
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实现的更多相关文章
- Boyer–Moore (BM)字符串搜索算法
在计算机科学里,Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法.它由Bob Boyer和J Strother Moore设计于1977年.此算法仅对搜索目标字符串(关键字)进行预处 ...
- 字符串与模式匹配算法(四):BM算法
一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...
- 字符串匹配算法之BM算法
BM算法,全称是Boyer-Moore算法,1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法. BM算法定义了两个规则: ...
- 字符串匹配算法之 kmp算法 (python版)
字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...
- hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...
- 【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法
字符串搜索中,BFS算法很巧妙,个人认为BFS算法效率是最高的. [StringSearch]就是根据BFS算法并优化. 使用方法: string s = "中国|国人|zg人|fuck|a ...
- 对《禁忌搜索(Tabu Search)算法及python实现》的修改
这个算法是在听北大人工智能mooc的时候,老师讲的一种局部搜索算法,可是举得例子不太明白.搜索网页后,发现<禁忌搜索(Tabu Search)算法及python实现>(https://bl ...
- LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他
LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...
- LeetCode初级算法的Python实现--字符串
LeetCode初级算法的Python实现--字符串 # 反转字符串 def reverseString(s): return s[::-1] # 颠倒数字 def reverse(x): if x ...
随机推荐
- 简说Python之flask-SQLAlchmey的web应用
目录 原生语句操作MySQL数据库 1.安装MySQL 2.MySQL设置用户和权限 3.用PyMySQL操纵MySQL数据库 4. CRUD增,删,改,查 使用SQLAlchemy 1.安装SQLA ...
- Spring Boot 结合 Redis 序列化配置的一些问题
前言 最近在学习Spring Boot结合Redis时看了一些网上的教程,发现这些教程要么比较老,要么不知道从哪抄得,运行起来有问题.这里分享一下我最新学到的写法 默认情况下,Spring 为我们提供 ...
- Uiautomator1.0与Uiautomator2.0测试项目搭建与运行原理
Uiautomator是Android原生测试框架,可以用于白盒接口测试也可以用于UI自动化测试,Uiautomator分1.0版本与2.0版本,它们都是基于UiAutomation的测试框架,都是通 ...
- PPP协议(简述)
PPP协议(链路层协议):用于点对点信道.互联网用户通常需要连接到某个ISP(运营商)之后才能接入到互联网,PPP协议是用户计算机和ISP(运营商)进行通信时所使用的数据链路层协议.该协议可支持同一时 ...
- webstorm 开新项目 setting 设置@目录别名 add @ (languages & Framewors - Javascript - Webpack 4. setting eslint enable
webstorm 开新项目 setting 设置@目录别名 add @ (languages & Framewors - Javascript - Webpack 4. setting esl ...
- Who Gets the Most Candies? POJ - 2886(线段树单点更新+区间查询+反素数)
预备知识:反素数解析 思路:有了反素数的解法之后就是线段树的事了. 我们可以用线段树来维护哪些人被淘汰,哪些人没被淘汰,被淘汰的人的位置,没被淘汰的人的位置. 我们可以把所有人表示为一个[1,n]的区 ...
- CSS劫持攻击
CSS劫持攻击 CSS劫持是一种并不很受重视的劫持方式,但是其也有一定的危害,且由于其并不一定需要依赖JavaScript,这使得此种攻击方式更容易实现. ClickJacking点击劫持 当访问某网 ...
- C语言经典练习题:水仙花数
废话不说直接进入正题:传说中的水仙花数就是一个三位数的各个位数的三次方之和就是这个数本身例如153=1*1*1+5*5*5+3*3*3. 好,开始解题:首先,题中已经说了水仙花数是一个三位数,也就是说 ...
- 贪心-Bag of Tokens
2020-01-20 22:32:28 问题描述: 问题求解: 双指针 + 贪心. public int bagOfTokensScore(int[] tokens, int P) { Arrays. ...
- 避免自己写的 url 被diss!建议看看这篇RestFul API简明教程!
大家好我是 Guide 哥!这是我的第 210 篇优质原创!这篇文章主要分享了后端程序员必备的 RestFul API 相关的知识. RestFul API 是每个程序员都应该了解并掌握的基本知识,我 ...