BM算法模式匹配——字符串与KMP比较
下面是代码:BM是什么参考阮一峰老师的讲解 点击打开链接
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include <time.h>
#include<windows.h>
using namespace std;
const int MAX_SIZE=5005; void set_ASC(int *ASC,int len,string& b,int& last)
{
int i;
for(i=0; i<len; i++)
{
ASC[ (int)b[i]]=i;
if(b[i]==b[len-1]&&i!=len-1) last=i;
}
}
int bm(string &a,string& b)
{
int ASC[260],lena=a.size(),lenb=b.size();
int i=lenb-1,j=lenb-1;
int last=-1;
memset(ASC,-1,sizeof(ASC));
set_ASC(ASC,lenb,b,last);
while(i<lena&&j<lenb)
{
int ii,jj;
ii=i,jj=j;
while(1)
{
if(a[ii]==b[jj])
{
if(jj==0) return ii+1;
ii--,jj--;
}
else
{
if(jj!=lenb-1) i+=max((jj-ASC[(int)a[ii]]),lenb-1-last);
else i+=(jj-ASC[(int)a[ii]]);
j=lenb-1;
break;
}
}
}
return -1;
}
void set_kmp_next(int *kmp_next,int len,string& b)
{
int i=0,j=-1;
kmp_next[0]=-1;
while(i<len)
{
if(j==-1||b[i]==b[j])
{
i++;
j++;
kmp_next[i]=j;
}
else
j=kmp_next[j];
}
}
int kmp(string &a,string& b) // a 为原串 ,b 为模式串
{
int i,j,lena=a.size(),lenb=b.size();
int kmp_next[MAX_SIZE];
set_kmp_next(kmp_next,lenb,b);
i=j=0;
while(i<lena)
{
if(j==-1||a[i]==b[j])
{
i++;
j++;
}
else
j=kmp_next[j];
if(j==lenb)
return i-j+1;
}
return -1;
}
int main()
{
// freopen("stdin.txt","r",stdin);
// freopen("stdout.txt","w",stdout);
string a,b;
while(cin>>a>>b)
{
printf("%d\n",bm(a,b));
printf("%d\n",kmp(a,b));
printf("\n");
}
return 0;
}
BM算法模式匹配——字符串与KMP比较的更多相关文章
- c算法:字符串查找-KMP算法
/* *用KMP算法实现字符串匹配搜索方法 *该程序实现的功能是搜索本目录下的所有文件的内容是否与给定的 *字符串匹配,如果匹配,则输出文件名:包含该字符串的行 *待搜索的目标串搜索指针移动位数 = ...
- Sunday算法(字符串查找、匹配)
字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...
- 字符串匹配算法——KMP、BM、Sunday
KMP算法 KMP算法主要包括两个过程,一个是针对子串生成相应的“索引表”,用来保存部分匹配值,第二个步骤是子串匹配. 部分匹配值是指字符串的“前缀”和“后缀”的最长的共有元素的长度.以“ABCDAB ...
- 字符串匹配算法KMP算法
数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多 ...
- Boyer-Moore字符串搜索(BM算法)的Python实现
BM算法根据两个判据来进行字符串匹配,分别是“坏字符规则”和‘好后缀规则",其中好后缀规则可以单独使用,算法的图解可以参照下面这篇博文: https://www.cnblogs.com/wx ...
- 字符串与模式匹配算法(四):BM算法
一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...
- hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...
- 字符串查找KMP算法(转)
如果你用过ctrl+F这个快捷键,那么你有很大的概率使用过这个算法,这就是在待查找字符串(可能有成千上万个字符)中找出模式串(比较小,可能有几个字符),可能找到大于或者等于1次的位置.例如,在abab ...
- 字符串查找KMP算法
如果你用过ctrl+F这个快捷键,那么你有很大的概率使用过这个算法,这就是在待查找字符串(可能有成千上万个字符)中找出模式串(比较小,可能有几个字符),可能找到大于或者等于1次的位置.例如,在abab ...
随机推荐
- 安卓解析JSON文件
安卓解析JSON文件 根据JOSN文件的格式,文件只有两种数据,一是对象数据,以 {}为分隔,二是数组,以[]分隔 以下介绍安卓如何解析一个JSON文件,该文件存放在assets目录下,即:asset ...
- 解决三星 BIOS 模式没有 Fast Bios Mode选项 U盘动项问题
今天想分下盘,进入biso竟然没有网上说 Fast Bios Mode选项,最后自己误打误撞竟然设置成功了,太不可思议了官方这么说:开机按F2进入BIOS设置,找到Boot选项下Boot Device ...
- VMware虚拟机下安装hadoop1.x
这是Hadoop学习全程记录第1篇,在这篇里我将介绍一下如何在Linux下安装Hadoop1.x. 先说明一下我的开发环境: 虚拟机:VMware8.0: 操作系统:CentOS6.4: 版本:jdk ...
- pandaboard串口通信调试
1.在PC上的pyserial程序,到pandaboard后报错,读取和写入会报错 2.使用的是pandaboard的ttyO2串口 3.ls -l /dev/ttyO2,发现是tty,而不是dial ...
- pandaboard用wifi时打不开网页
不可以手动修改/etc/resolv.conf,因为重启会被自动清空(raspberry pi 可以) 修改 resolvconf服务的配置文件: /etc/resolvconf/resolv.con ...
- GRYZY #8. 公交车
公交车(bus) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK在玩一个游戏. 有k群小怪兽想乘坐公交车.第i群小怪兽想从xi出发乘坐公交车到yi.但公交车 ...
- Spring中使用byName实现Beans自动装配
以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byname.html: 此 ...
- amplab
https://github.com/amplab/SparkNet https://amplab.cs.berkeley.edu/
- 用C++实现一个Log系统
提要 近期在写一些C++的图形代码,在调试和測试过程中都会须要在终端打印一些信息出来. 之前的做法是直接用 std::cout<<"Some Word"<< ...
- mysql中游标在存储过程中的具体使用方法
昨天写的一个东东,分享下给大家. drop PROCEDURE if exists sp_cleanUserData; CREATE PROCEDURE `sp_cleanUserData`() ...