c++Boyer-Moore算法的介绍与代码实现(c++)

Boyer-Moore算法是一种用于字符串匹配的高效算法,主要用于在一个文本串中查找一个模式串的出现位置。它的主要思想是利用模式串中的字符分布信息来尽量减少比较的次数,从而提高匹配的效率。

Boyer-Moore算法的关键思想包括两个部分:坏字符规则(Bad Character Rule)和好后缀规则(Good Suffix Rule)。

  1. 坏字符规则(Bad Character Rule):

    • 当发现不匹配时,根据模式串中当前不匹配的字符(即坏字符),将模式串向右移动一定的位数。
    • 如果模式串中不存在该坏字符,则将模式串整体移动到坏字符后的下一个位置。
  2. 好后缀规则(Good Suffix Rule):

    • 当发现不匹配时,根据模式串中已经匹配的部分(好后缀),将模式串向右移动一定的位数。
    • 如果模式串的好后缀在模式串本身找不到重叠的部分,则尝试将模式串中的后缀与前缀进行匹配,找到可以重叠的相同部分。

Boyer-Moore算法通过不断比较模式串和文本串的字符,利用上述规则来快速定位需要比较的位置,从而减少比较的次数,提高字符串匹配的效率。这种算法在实际应用中效果显著,尤其适用于较长的文本串和模式串。

需要注意的是,Boyer-Moore算法的实现相对复杂,需要考虑各种边界情况和细节,以确保算法的正确性和高效性。

以下是一个简单的 C++ 实现 Boyer-Moore 算法的示例代码:

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>int max(int a, int b) {return (a > b) ? a : b;
}void preprocessBadCharShift(const std::string& pattern, std::unordered_map<char, int>& badCharShift) {for (int i = 0; i < pattern.length(); i++) {badCharShift[pattern[i]] = i;}
}void preprocessGoodSuffixShift(const std::string& pattern, std::vector<int>& goodSuffixShift) {int m = pattern.length();std::vector<int> suffixes(m + 1, 0);for (int i = 0; i < m; i++) {int length = 0;while (pattern[i - 1 - length] == pattern[m - 1 - length] && length < i) {length++;suffixes[length] = i - 1 - length;}}for (int i = 0; i <= m; i++) {goodSuffixShift[i] = m - suffixes[m];}
}void boyerMooreSearch(const std::string& text, const std::string& pattern) {std::unordered_map<char, int> badCharShift;std::vector<int> goodSuffixShift(pattern.length() + 1, pattern.length());preprocessBadCharShift(pattern, badCharShift);preprocessGoodSuffixShift(pattern, goodSuffixShift);int n = text.length();int m = pattern.length();int s = 0; // Shift of the pattern with respect to the textwhile (s <= n - m) {int j = m - 1;while (j >= 0 && pattern[j] == text[s + j]) {j--;}if (j < 0) {std::cout << "Pattern occurs with shift " << s << std::endl;s += goodSuffixShift[0];} else {s += max(goodSuffixShift[j + 1], j - badCharShift[text[s + j]]);}}
}int main() {std::string text = "AABAACAADAABAABA";std::string pattern = "AABA";boyerMooreSearch(text, pattern);return 0;
}

这段代码实现了 Boyer-Moore 算法在 C++ 中的基本逻辑。在实际使用中,可以根据具体需求进行定制和优化。请注意,这只是一个简单的示例,实际应用中可能需要考虑更多的情况和细节来确保算法的正确性和高效性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux和Windows集群中部署HTCondor

目录 1、集群架构 2、HTCondor版本 3、Linux系统安装 3.1、HTCondor安装 3.2、中央管理节点配置 3.3、其他节点配置 4、Windwos系统安装 5、安全配置 6、参考 1、集群架构 操作系统IP地址1*Ubuntu22.04192.168.1.742Ubuntu22.04192.168.1.603Ubuntu22.04192.168.1.6…

[FastDDS] 基于eProsima FastDDS的移动机器人数据中间件——介绍与准备工作

[FastDDS] 基于eProsima FastDDS的移动机器人数据中间件——介绍与准备工作 注明&#xff1a;无 本栏目主要讲述&#xff0c;基于eProsima FastDDS的移动机器人数据中间件的实现、使用、性能测试。 What is [ FastDDS ]: eProsima Fast DDS是DDS&#xff08;数据分发服务&…

Squid代理服务器配置

需求是&#xff1a;通过外网机&#xff08;跳板机&#xff09;访问内网机&#xff0c;并为内网机提供访问网络的能力。 【跳板机T】【内网机N】 公网IP&#xff1a;39.107.xx.xxx 跳板机IP&#xff1a;172.17.216.234 内网机IP&#xff1a;172.17.216.241 Squid代理服务器地址…

探讨分布式数据库ID生成解决方案

在技术面试中&#xff0c;面试官通常通过挑战应聘者的分布式系统知识来评估其能力。今天&#xff0c;让我们模拟一场面试现场&#xff0c;深入了解关于分布式数据库ID生成的解决方案。 面试官&#xff1a;嘿&#xff0c;小伙子&#xff0c;分布式数据库ID生成解决方案了解吗&a…

Linux磁盘设备LVM介绍和常用场景说明

Linux常见的物理设备数据备份和负载均衡模式 1. LVM技术说明2. 相关概念3. 常用命令3.1 安装lvm命令3.2 创建分区3.3 格式化成LVM3.4 其他格式化 4. 常用场景4.1 创建LVM并挂载4.2 LVM扩容4.2.1 xfs扩容4.2.2 ext4扩容 4.2 缩减逻辑卷lv4.3 缩减vg&#xff1a;&#xff08;迁移…

设计模式(二)单例模式

单例模式&#xff1a;确保一个类只有一个实例&#xff0c;并提供了全局访问点&#xff1b;主要是用于控制共享资源的访问&#xff1b; 单例模式的实现分为懒汉式和饿汉式。 懒汉式单例在需要时才会创建&#xff0c;而饿汉式单例则在类加载时立即创建实例&#xff1b; 单例模…

印象笔记 - Markdown 入门指南

一、Markdown 是什么&#xff1f; Markdown 是一种轻量级的「标记语言」&#xff0c;创始人为约翰格鲁伯&#xff0c;用简洁的语法代替排版&#xff0c;目前被越来越多的知识工作者、写作爱好者、程序员或研究员广泛使用。其常用的标记符号不超过十个&#xff0c;相对于更为复…

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人

一文速览深度伪造检测&#xff08;Detection of Deepfakes&#xff09;&#xff1a;未来技术的守门人 前言一、Deepfakes技术原理卷积神经网络&#xff08;CNN&#xff09;&#xff1a;细致的艺术学徒生成对抗网络&#xff08;GAN&#xff09;&#xff1a;画家与评审的双重角色…

MySQL 逗号分隔查询--find_in_set()函数

业务场景&#xff1a; 在使用MySQL的时候&#xff0c;可能的某个字段存储的是一个英文逗号分割的字符串&#xff08;这里我们不讨论表设计的合理性&#xff09;&#xff0c;如图所示&#xff1a; 我们在查询的时候需要匹配逗号分割中的某个字符串&#xff0c;该怎么查询呢&am…

CRM 系统:管理工作流程的最佳利器全面解析

一个好的CRM解决方案能够使您业务保持活力——也就是管理客户。这意味着CRM系统提供了包括流程自动化、联系人管理、多渠道管理、数据分析等一系列工具。可以说&#xff0c;CRM是企业管理工作流程的最佳工具之一。 现在&#xff0c;市场上有上万种不同类型的CRM解决方案&#…

vue中的ref/reactive区别及原理

Vue中的ref和reactive是两种不同的数据响应式管理方式。 ref是Vue 3中新加入的特性&#xff0c;它可以将一个普通的JavaScript对象转换为响应式对象。通过ref创建的响应式对象在访问和修改时会自动触发重新渲染。ref返回的是一个包含value属性的对象&#xff0c;访问或修改数据…

突破编程_C++_高级教程(异常处理的高级特性)

1 异常处理的高级特性 1.1 异常处理的嵌套 在 C 中&#xff0c;异常处理是通过 try, catch, throw 关键字来实现的。当在一个 try 块中抛出一个异常时&#xff0c;该异常会被最近的匹配的 catch 块捕获。如果在当前的 try 块或其嵌套的 try 块中没有匹配的 catch 块&#xff…

机器学习提升秘籍:Scikit-learn学习网站全攻略!

介绍&#xff1a;是一个开源的Python机器学习库&#xff0c;它提供了一整套用于数据挖掘和数据分析的工具&#xff0c;包括各种分类、回归、聚类和降维算法以及模型评估、选择和数据预处理等功能。以下是关于Scikit-learn的一些详细介绍&#xff1a; 算法覆盖广泛&#xff1a;S…

【Java基础】Java字符切割工具详解与使用(1)

在Java开发中&#xff0c;字符串操作是一项常见而重要的任务&#xff0c;而字符切割就是其中一个常用的操作之一。本篇博客将深入探讨Java中字符切割的工具&#xff0c;介绍如何使用这些工具&#xff0c;评估它们的性能&#xff0c;并指出可能遇到的一些坑。 1、字符串切割方法…

Mendix 开发实践指南|Mendix的核心概念

在当今快速变化的技术环境中&#xff0c;Mendix平台以模型驱动开发方法&#xff0c;重新定义了应用程序的构建过程。本章内容&#xff0c;将深入探讨Mendix的几大核心概念&#xff1a;模型驱动开发、微流、纳流 、 实体模型和页面&#xff0c;旨在帮助我们全面理解Mendix平台的…

java之Bean对象

1. 什么是Bean&#xff1f; Bean被实例化的&#xff0c;是被Spring框架所管理的Java对象。 Spring容器会自动完成Bean的实例化。将所创建的的Bean自动注入到Ioc容器中以供调用。 spring框架中 IOC容器中管理的对象就是Bean对象 2. 第三方bean Bean 因为第三方bean&#xff0…

《The Art of InnoDB》第二部分|第4章:深入结构-磁盘结构-undo log

4.4 undo log 目录 4.4 undo log 4.4.1 undo log 介绍 4.4.2 undo log 配置 4.4.3 undo log file 结构 4.4.4 undo log mvcc 实现 4.4.5 undo log rollback 实现 4.5.6 undo log 崩溃恢复 4.5.7 小结

​LeetCode解法汇总2476. 二叉搜索树最近节点查询

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; GitHub - September26/java-algorithms: 算法题汇总&#xff0c;包含牛客&#xff0c;leetCode&#xff0c;lintCode等网站题目的解法和代码&#xff0c;以及完整的mode类&#…

模拟实现qsort函数:冒泡排序详解

上一篇qsort函数详解&#xff1a;深入了解C语言的qsort函数&#xff1a;原理及相关知识-CSDN博客 目录 一、冒泡排序的原理 二、模拟实现qsort函数 在C语言中&#xff0c;标准库提供了qsort函数用于对数组进行排序。qsort函数是一个通用的排序函数&#xff0c;可以根据用户提…

Java WEB面试系列-03

1. Java 中如何获取 ServletContext 实例? 1、javax.servlet.Filter中直接获取 ServletContext context = config.getServletContext();2、HttpServlet中直接获取 this.getServletContext()3、在其他方法中通过HttpRequest获得 request.getSession().getServletContext();…