BMH算法

BMH(Boyer-Moore-Horspool)算法是BM(Boyer-Moore)算法的一种优化,P从最右边开始比较
核心:焦点在于坏字符上,根据字符在模式串P中出现的最后的位置算出偏移长度,偏移模式串的长度。

坏字符偏移表

在预处理中,计算大小为|∑|的偏移表。
设m为P串的长度:
字符在P模式串中 **bmBc[char] = m-1-max **
↗ (max为字符在P的最大位置,对于P串最后一个字符,若此前出现过则保留原值,否则偏移值为m)

字符不在P模式串中 bmBc[char] = m
例如:
P = “GTTAC” ,m = 5
bmBc[T] = 5 - 1 - max(T的位置) = 5 - 1 - 2 = 2
bmBc[C] = 5(C只在最后一个位置出现过,所以直接取长度m)
bmBc[U] = 5(U ∉ P)

计算可知偏移表如下:

字符 G T A C 其他
偏移量 4 2 1 5 5

P为短串(模式串),T为长串(目标串)

  1. a中短串从‘C’往左比较,在长串‘T’字符位置失配,此时应从长串里已完成匹配的子串中找到最右端字符,本例为‘C’,查表可知C的偏移量为5,短串右移五格。
  2. b图中首字符失配,且U在短串未出现过,短串右移五格。
  3. c图长串首字符‘T’失配,T的偏移量为2,短串右移两格。
  4. 最后一轮正好完全匹配。
#include<bits/stdc++.h>
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxchar = 256;
void preBMH(const char* patt, int m, int bmBc[]) {int k = 0;for (k = 0; k < maxchar; k++) bmBc[k] = m;/*m-1是为了考虑最后的字符在之前是否已有的情况,若没有则直接继承上面循环的m,若有就在本次循环更新*/ for (k = 0; k < m-1; k++)bmBc[patt[k]] = m-k-1;
}
int BMH (string p, string t) {int m = p.length();int n = t.length();if (m > n) {cout << "find fail" <<endl;return -1;}int bmBc[maxchar];const char* patt = p.c_str();const char* text = t.c_str();preBMH(patt, m, bmBc);//定在P的最后一个字符 int k = m-1;while (k < n) {//j为p串,i为目标串 int j = m-1;int i = k;//从最右向左比较 while (j >= 0 && text[i] == patt[j]) {j--;i--;}//P全部匹配时i+1才为P的首字符index if (j == -1) return i+1; //偏移量看的是目标串已完成匹配的子串中最右端字符!!k += bmBc[text[k]]; }
}
int main() {fiostring t = "GCCTCATCCUACGTTAC";string p = "GTTAC";int ans = BMH(p, t);cout << ans << endl;
}

字符串匹配(二)——逆向思维 BMH相关推荐

  1. 【数据结构与算法】字符串匹配 BF算法 RK算法

    单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法 多模式串匹配算法 Trie 树和 AC 自动机 一.BF 算法 1,BF算法是Brute Force的缩写,中文译作暴力匹配算法,也 ...

  2. [算法系列之二十六]字符串匹配之KMP算法

    一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利 ...

  3. 字符串匹配——BMH算法

    字符串匹配--BMH算法 给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1. 这样的问题就是字符串匹配问题,这里给出BMH算法的思想. 设主串T的长度为n,模式串P的长度 ...

  4. CCF201409-3 字符串匹配(解法二)(100分)(废除!!!)

    试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需 ...

  5. 三十五、字符串匹配问题--KMP算法

    一.暴力匹配算法实现字符串匹配 如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有: 如果当前字符匹配成功(即 str1[i] == str2[j]) ...

  6. 字符串匹配的KMP算法和C语言代码,不需要思考就能理解

    KMP算法用于判断一个字符串是否包含另一个字符串,如果包含就返回脚标.其实KMP算法本身特别简单,我看了几篇本章都号称简单易懂,结果看得我云里雾里,直到我看到了阮一峰:字符串匹配的KMP算法,才真正看 ...

  7. 字符串匹配のKMP【专题@AbandonZHANG】

    算法详解 很长时间内都没有能够很理解KMP算法的精髓,尤其是很多书上包括<算法导论>没有把next函数(亦或 π函数)讲解的很透彻. 今天去看了matrix67大牛博客中关于kmp部分的讲 ...

  8. 【NLP】基于TF-IDF和KNN的模糊字符串匹配优化

    作者 | Audhi Aprilliant 编译 | VK 来源 | Towards Data Science 在处理真实数据时,最大的问题主要是数据预处理. 匹配可能是许多分析师面临的最大挑战之一. ...

  9. 数据结构与算法 / 字符串匹配 / BF、PK 算法

    零.前言 为了下面便于说明,先定义两个名词,分别是主串和模式串.在字符串 A 中查找字符串 B,则 A 为主串,B 为模式串. 假设,主串中字符数量为 L1,模式串的字符数量为 L2 . 一.BF 算 ...

  10. # 字符串从右往左查找_字符串匹配(搜索,查找)算法

    (一)前言 所谓的字符串匹配就是在一个长字符串(可称文本T)中找一个短字符串(可称模式P),看长字符串中是否存在短字符串,若存在则返回出现的第一个位置,若不存在则返回一个标记.字符串搜索算法有很多,比 ...

最新文章

  1. java this final_Java this、final等关键字总结
  2. 传统Excel绩效考核和绩效管理系统区别
  3. 初识、理解生成器模式
  4. python【蓝桥杯vip练习题库】ALGO-77 斜率计算
  5. 【数据竞赛】DoubleEnsemble--专治硬样本的神奇集成技术。
  6. springBoot的模版引擎
  7. CF1109D Sasha and Interesting Fact from Graph Theory
  8. 【转】用Microsoft Ajax Minifier帮你的Javascript瘦身
  9. with grant option 与with admin option的区别
  10. highcharts:根据Y的数值范围,动态改变图形的填充颜色
  11. c语言实习报告,计算机c语言编程实习心得
  12. 如何查看和修改Windows的主机名
  13. 固态硬盘数据恢复教您如何操作
  14. 设置网页头部图标icon
  15. 我会java什么梗_抖音不会真的有人什么梗 不会真的有人不会吧不会吧别恶心我梗意思及出处...
  16. Udesk作为国内SaaS客户服务领域的翘楚,将对标海外巨头Oracle丨Xtecher 封面
  17. 【转载】财务自由有多重要?
  18. 公众号,知识分享就是每天坚持写写写?
  19. ValueError: [E030] Sentence boundaries unset. You can add the 'sentencizer' component to the pipelin
  20. BI的体系架构及相关技术

热门文章

  1. 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger...
  2. HDOJ 1002 A + B Problem II 解题报告
  3. 【李宏毅2020 ML/DL】P1 introduction
  4. 定义css设备类型-Media Queries
  5. 用css3制作一个搜索框效果
  6. Linux基础(5)--Linux常用命令表
  7. L1-043 阅览室 (20 分)(在线模拟题)
  8. 7-176 求n以内最大的k个素数以及它们的和 (20 分)
  9. 7-181 最长连续递增子序列 (20 分)
  10. 输出三角形字符阵列 (15 分)