字符串匹配(二)——逆向思维 BMH
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为长串(目标串)
- a中短串从‘C’往左比较,在长串‘T’字符位置失配,此时应从长串里已完成匹配的子串中找到最右端字符,本例为‘C’,查表可知C的偏移量为5,短串右移五格。
- b图中首字符失配,且U在短串未出现过,短串右移五格。
- c图长串首字符‘T’失配,T的偏移量为2,短串右移两格。
- 最后一轮正好完全匹配。
#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相关推荐
- 【数据结构与算法】字符串匹配 BF算法 RK算法
单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法 多模式串匹配算法 Trie 树和 AC 自动机 一.BF 算法 1,BF算法是Brute Force的缩写,中文译作暴力匹配算法,也 ...
- [算法系列之二十六]字符串匹配之KMP算法
一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利 ...
- 字符串匹配——BMH算法
字符串匹配--BMH算法 给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1. 这样的问题就是字符串匹配问题,这里给出BMH算法的思想. 设主串T的长度为n,模式串P的长度 ...
- CCF201409-3 字符串匹配(解法二)(100分)(废除!!!)
试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需 ...
- 三十五、字符串匹配问题--KMP算法
一.暴力匹配算法实现字符串匹配 如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有: 如果当前字符匹配成功(即 str1[i] == str2[j]) ...
- 字符串匹配的KMP算法和C语言代码,不需要思考就能理解
KMP算法用于判断一个字符串是否包含另一个字符串,如果包含就返回脚标.其实KMP算法本身特别简单,我看了几篇本章都号称简单易懂,结果看得我云里雾里,直到我看到了阮一峰:字符串匹配的KMP算法,才真正看 ...
- 字符串匹配のKMP【专题@AbandonZHANG】
算法详解 很长时间内都没有能够很理解KMP算法的精髓,尤其是很多书上包括<算法导论>没有把next函数(亦或 π函数)讲解的很透彻. 今天去看了matrix67大牛博客中关于kmp部分的讲 ...
- 【NLP】基于TF-IDF和KNN的模糊字符串匹配优化
作者 | Audhi Aprilliant 编译 | VK 来源 | Towards Data Science 在处理真实数据时,最大的问题主要是数据预处理. 匹配可能是许多分析师面临的最大挑战之一. ...
- 数据结构与算法 / 字符串匹配 / BF、PK 算法
零.前言 为了下面便于说明,先定义两个名词,分别是主串和模式串.在字符串 A 中查找字符串 B,则 A 为主串,B 为模式串. 假设,主串中字符数量为 L1,模式串的字符数量为 L2 . 一.BF 算 ...
- # 字符串从右往左查找_字符串匹配(搜索,查找)算法
(一)前言 所谓的字符串匹配就是在一个长字符串(可称文本T)中找一个短字符串(可称模式P),看长字符串中是否存在短字符串,若存在则返回出现的第一个位置,若不存在则返回一个标记.字符串搜索算法有很多,比 ...
最新文章
- java this final_Java this、final等关键字总结
- 传统Excel绩效考核和绩效管理系统区别
- 初识、理解生成器模式
- python【蓝桥杯vip练习题库】ALGO-77 斜率计算
- 【数据竞赛】DoubleEnsemble--专治硬样本的神奇集成技术。
- springBoot的模版引擎
- CF1109D Sasha and Interesting Fact from Graph Theory
- 【转】用Microsoft Ajax Minifier帮你的Javascript瘦身
- with grant option 与with admin option的区别
- highcharts:根据Y的数值范围,动态改变图形的填充颜色
- c语言实习报告,计算机c语言编程实习心得
- 如何查看和修改Windows的主机名
- 固态硬盘数据恢复教您如何操作
- 设置网页头部图标icon
- 我会java什么梗_抖音不会真的有人什么梗 不会真的有人不会吧不会吧别恶心我梗意思及出处...
- Udesk作为国内SaaS客户服务领域的翘楚,将对标海外巨头Oracle丨Xtecher 封面
- 【转载】财务自由有多重要?
- 公众号,知识分享就是每天坚持写写写?
- ValueError: [E030] Sentence boundaries unset. You can add the 'sentencizer' component to the pipelin
- BI的体系架构及相关技术
热门文章
- 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger...
- HDOJ 1002 A + B Problem II 解题报告
- 【李宏毅2020 ML/DL】P1 introduction
- 定义css设备类型-Media Queries
- 用css3制作一个搜索框效果
- Linux基础(5)--Linux常用命令表
- L1-043 阅览室 (20 分)(在线模拟题)
- 7-176 求n以内最大的k个素数以及它们的和 (20 分)
- 7-181 最长连续递增子序列 (20 分)
- 输出三角形字符阵列 (15 分)