BoyerMoore字符串搜索算法

BoyerMoore 字符串搜索算法,返回pat在txt中第一次出现的起始位置,若不存在则返回-1,算法复杂度为O(N), 最坏为O(M*N) (M、N分别为pat与txt的长度)。

 1 #include <vector>
 2 #include <list>
 3 #include <map>
 4 #include <set>
 5 #include <queue>
 6 #include <deque>
 7 #include <stack>
 8 #include <bitset>
 9 #include <algorithm>
10 #include <functional>
11 #include <numeric>
12 #include <utility>
13 #include <sstream>
14 #include <iostream>
15 #include <iomanip>
16 #include <cstdio>
17 #include <cmath>
18 #include <cstdlib>
19 #include <ctime>
20 #include <cstring>
21 #include <string>
22
23 using namespace std;
24
25 #define sz(a) int((a).size())
26 #define pb push_back
27
28
29 class BoyerMoore {
30 private:
31     int R;
32     string pat;
33     vector<int> right;     // the bad-character skip array
34
35 public:
36     BoyerMoore(string _pat, int _R = 256) {
37         pat = _pat;
38         R = _R;
39         right = vector<int> (R, -1);
40
41         for (int i = 0; i < sz(pat); ++i) {
42             right[pat[i]] = i;
43         }
44     }
45
46
47     // return offset of first match; -1 if no match
48     int search(string txt) {
49         int M = sz(pat);
50         int N = sz(txt);
51         int skip;
52         for (int i = 0; i <= N - M; i += skip) {
53             skip = 0;
54             for (int j = M-1; j >= 0; j--) {
55                 if (pat[j] != txt[i+j]) {
56                     skip = max(1, j - right[txt[i+j]]);
57                     break;
58                 }
59             }
60             if (skip == 0) return i;    // found
61         }
62         return -1;                       // not found
63     }
64
65 };
66
67
68 int main() {
69     string txt, pat;
70     cin >> txt;
71     cin >> pat;
72
73     BoyerMoore *obj = new BoyerMoore(pat);
74     int pos = obj->search(txt);
75
76     cout << pos << endl;
77
78
79     delete obj;
80     return 0;
81 }
时间: 2024-10-02 19:02:08

BoyerMoore字符串搜索算法的相关文章

grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)

这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解这个算法,发现这个算法一开始还挺难理解的,也许是我理解能力不是很好吧,花了小半天才看懂,看懂了过后就想分享下,因为觉得这个算法真的挺不错的,以前一直以为字符串搜索算法中KMP算很不错的了,没想到还有更好的,Boyer-Moore算法平均要比KMP快3-5倍. 下面是我对该算法的理解,参考了一些关于该

字符串搜索算法Boyer-Moore的Java实现

由于是毕业后转行的原因,所以本人在工作之前没有系统的学过数据结构.算法导论之类的课.说白了就是没有这样的底蕴,哈哈.所以这篇博客主要是写给自己看的,因为时间有限,本人写的内容估计远远不会有大家期待的那么详细,所以,可以此文可以选择性的忽略哦. 算法介绍:关于Boyer-Moore算法(后面简称BM算法)的概念网上一搜一大把.所以这里就不做具体阐述了.有疑问的建议参考阮一峰的这篇文章(此文文笔细腻且又通俗易懂): 阮一峰:字符串匹配的Boyer-Moore算法 算法精髓:这个字符串查找算法高效的原

字符串搜索算法

http://dsqiu.iteye.com/blog/1700312 BF(Brute Force)算法 1.思想 2.编程实现 暴力算法,又称朴素算法,是最基本的字符串搜索算法,当然也是效率最低的算法. 3.时间复杂度 时间复杂度为O(m*n) //m与n分别为2个字符串的长度 4.补充资料 KMP(Knuth-Morris-Pratt)算法 1.思想 2.编程实现 暴力算法,又称朴素算法,是最基本的字符串搜索算法,当然也是效率最低的算法. 3.时间空间复杂度 4.补充资料 http://w

[算法系列之十四]字符串匹配之Morris-Pratt字符串搜索算法

前言 我们前面已经看到,蛮力字符串匹配算法和Rabin-Karp字符串匹配算法均非有效算法.不过,为了改进某种算法,首先需要详细理解其基本原理.我们已经知道,暴力字符串匹配的速度缓慢,并已尝试使用Rabin-Karp中的一个散列函数对其进行改进.问题是,Rabin-Karp的复杂度与强力字符串匹配相同,均为O(mn). 我们显然需要采用一种不同方法,但为了提出这种不同方法,先来看看暴力字符串匹配有什么不妥之处.事实上,再深入地研究一下它的基本原理,就能找到问题的答案了. 在暴力匹配算法中,需要检

Simpliciy + KMP + BM 字符串搜索算法

Simplicity #include <stdio.h> #include <string.h> int simplicity(char *s, char *t, int pos); int simplicity(char *s, char *t, int pos) { int slen = strlen(s); int tlen = strlen(t); int i = pos; int j = 0; while(i < slen && j < tl

leetcode | Implement strStr() | 实现字符串查找函数

Implement strStr() : https://leetcode.com/problems/implement-strstr/ Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 如:haystack = "bcbcda"; needle = "bcd" 则 return 2 解析:字符串查找函数,

4种字符串匹配算法:BS朴素 Rabin-karp 有限自动机 KMP(上)

字符串的匹配的算法一直都是比较基础的算法,我们本科数据结构就学过了严蔚敏的KMP算法.KMP算法应该是最高效的一种算法,但是确实稍微有点难理解.所以打算,开这个博客,一步步的介绍4种匹配的算法.也是<算法导论>上提到的.我会把提到的四种算法全部用c/c++语言实现.提供参考学习.下图的表格,介绍了各个算法的处理时间和匹配时间.希望我写的比较清楚.如果不理解的,或者不对的,欢迎留言. 字符串匹配算法及其处理时间和匹配时间 算法 预处理时间 匹配时间 朴素算法 0 O((n-m+1)m) Rabi

关于两个字符串的kmp比对算法

关于两个字符串的kmp比对算法 假设有字符串X和Y,满足len(X)>len(Y),要比对这两个字符串. 我们知道,最朴实的方法,就是现将二者对齐,然后依次比对对应位置的字符.如果能匹配到Y最后位置,则匹配成功:如果匹配失败,则将Y右移一位,再从头进行匹配. 设字符串X为dababeabafdababcg:字符串Y为ababc. 这种比对方法如下所示: 起始时,二者对其,第一个字符不匹配 :| :dababeabafdababcg :ababc 右移一位,比对位置移动到Y起始位置 : | :da

[LeetCode] Implement strStr() [18]

题目 Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 原题链接(点我) 解题思路 字符串匹配这也是个老题了,方法主要有下面4种, 1. 暴利破解法(BF),这个没啥说的,就是一轮一轮的比较,知道遇到相匹配的,这个的时间复杂度为O(n^2). 2. KMP,这应该是字符串匹配领域中最长听说的算