首页 > 其他分享 >【模板】BM字符串匹配

【模板】BM字符串匹配

时间:2022-09-29 21:48:19浏览次数:69  
标签:std int BM char bad pattern 字符串 模板 size

据说效率是 KMP 的 \(3 \sim 4\) 倍。

主要利用坏字符和好后缀进行跳转来避免过多的匹配。

这篇博客讲的很好,推荐大家看看。

#include <iostream>
#include <vector>
#include <string>
const int size_of_cs = 256;
std :: vector<int> bad_char;
std :: vector<int> suffix;
std :: vector<bool> prefix;
void get_bad_char(std :: string &pattern) {
	bad_char.clear();
	for(int i = 0;i < size_of_cs;++i) 
		bad_char.emplace_back(-1);
	for(int i = 0;i < pattern.size();++i) 
		bad_char[(int)pattern[i]] = i;
}
void get_good_suf(std :: string &pattern) {
	for(int i = 0;i < pattern.size();++i) {
		suffix.emplace_back(-1);
		prefix.emplace_back(false);
	}
	for(int i = 0, j, k;i < pattern.size()-1;++i) {
		j = i;
		k = 0;
		while(j >= 0&&pattern[j] == pattern[pattern.size()-1-k]) 
			suffix[++k] = (--j)+1;
		if(j < 0) 
			prefix[k] = true;
	}
}
int move_by_good_suf(int pos,int length) {
	int k = length-1-pos;
	if(suffix[k] != -1) 
		return pos-suffix[k]+1;
	for(int i = pos+2;i < length;++i) 
		if(prefix[length = i]) 
			return i;
	return length;
}
int BM(std :: string &text,std :: string &pattern) {
	if(pattern.empty()) 
		return 0;
	get_bad_char(pattern);
	get_good_suf(pattern);
	for(int i = 0, x, y;i <= text.size()-pattern.size();i += std :: max(x,y)) {
		int j;
		for(j = pattern.size()-1;j >= 0;--j) 
			if(text[i+j] != pattern[j]) 
				break;
		if(j < 0) 
			return i;
		x = j-bad_char[(int)text[i+j]];
		y = 0;
		if(j < pattern.size()-1) 
			y = move_by_good_suf(j,pattern.size());
	}
	return -1;
}
std :: string text, pattern;
int main() {
	std :: cin >> text >> pattern;
	std :: cout << BM(text,pattern);
	return 0;
}

其实写了一版传统的 char* 的。

打炸了,再调罢。

标签:std,int,BM,char,bad,pattern,字符串,模板,size
From: https://www.cnblogs.com/bikuhiku/p/Boyer_Moore.html

相关文章

  • Leetcode 字符串轮转 KMP
    解题思路题面两倍s1变成字符串匹配,用KMP。KMP预先处理模式串(短串)的\(next[]\)数组,\(next[]\)的意思为自我匹配一样的值的下一个的位置。复杂度\(O(n)\)代码classSo......
  • C#中对象与JSON字符串互相转换的三种方式
    JSON(JavaScriptObjectNotation,JS对象标记)是一种轻量级的数据交换格式。关于内存对象和JSON字符串的相互转换,在实际项目中应比较广泛,经过一番搜索,找到如下三种方法......
  • 模板建立
    模板建立步骤如果还没有建立一个组存储自己的模板,则先选择2(红框处)然后取个名字就好如果已经有组了,在自己建立的组内添加新模板1:后续快速生成使用的代码2:......
  • 【Kettle】字符串替换不起作用
         字符串替换节点不起作用,一个原因是输入流字段和输出流字段名称相同,一个解决办法是修改输出流字段名称  ......
  • 面试题 01.09. 字符串轮转【暴力模拟】【尾插】
    题目字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。难度:简单提示:字符串长度在[0,100000]范围内......
  • Latex 如何写算法?推荐模板
    之前我已经在这篇文章总结了现有的算法包的区别。如果有选择苦难症的朋友可以考虑无脑使用以下模板来写算法。\usepackage[noend]{algpseudocode}#noend表示算法不显......
  • MYSQL连接字符串参数解析
    Server,host,datasource,datasource,address,addr,networkaddress:数据库位置(以上任何关键字均可)Database,initialcatalog:数据库名Port:      socket端口......
  • mysql如何替换部分字符串
    本篇内容主要讲解“mysql如何替换部分字符串”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql如何替换部分字符串”吧!......
  • vue Excel导入,下载Excel模板,导出Excel
    vue Excel导入,下载Excel模板,导出Excel<template><divstyle="display:flex;"><el-button@click="handleDownload"class="button_searc......
  • 驱动开发:内核字符串转换方法
    在内核编程中字符串有两种格式ANSI_STRING与UNICODE_STRING,这两种格式是微软推出的安全版本的字符串结构体,也是微软推荐使用的格式,通常情况下ANSI_STRING代表的类型是char*......