【用Java实现字符串匹配算法】1.暴力匹配(Brute Force Matching) 2.KMP算法(Knuth-Morris-Pratt Algorithm) 3.Boyer-Moore算法

比KMP高效的Boyer-Moore字符串匹配算法 在这里我所要想说的比KMP算法高效的算法是Boyer-Moore算法。        在讲解Boyer-moore算法之前,在这里先回顾一下KMP算法。        比如说有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"。大部分情况下我们会使用KMP算法去解:                           阅读详情

文章目录

  1. 暴力匹配(Brute Force Matching):
public class BruteForceMatching {
    public static int search(String text, String pattern) {
        int textLength = text.length();
        int patternLength = pattern.length();

        for (int i = 0; i <= textLength - patternLength; i++) {
            int j;
            for (j = 0; j < patternLength; j++) {
                if (text.charAt(i + j) != pattern.charAt(j)) {
                    break;
                }
            }
            if (j == patternLength) {
                return i; // 找到了匹配
            }
        }

        return -1; // 没有找到匹配
    }

    public static void main(String[] args) {
        String text = "Hello, world!";
        String pattern = "world";
        int index = search(text, pattern);
        if (index != -1) {
            System.out.println("Pattern found at index: " + index);
        } else {
            System.out.println("Pattern not found.");
        }
    }
}
  1. KMP算法(Knuth-Morris-Pratt Algorithm):

KMP算法的实现相对复杂,因为它需要预处理模式字符串以创建一个“部分匹配表”或“失败函数”。以下是KMP算法的一个简化实现:

public class KMPAlgorithm {
    private static int[] computeLPSArray(String pattern, int M, int lps[]) {
        int len = 0;
        int i = 1;
        lps[0] = 0; // lps[0] is always 0

        while (i < M) {
            if (pattern.charAt(i) == pattern.charAt(len)) {
                len++;
                lps[i] = len;
                i++;
            } else {
                if (len != 0) {
                    len = lps[len - 1];
                } else {
                    lps[i] = len;
                    i++;
                }
            }
        }
    }

    public static int KMPSearch(String text, String pattern) {
        int M = pattern.length();
        int N = text.length();

        int[] lps = new int[M];
        computeLPSArray(pattern, M, lps);

        int j = 0; // index for pattern[]
        int i = 0; // index for text[]

        while (i < N) {
            if (pattern.charAt(j) == text.charAt(i)) {
                j++;
                i++;
            }

            if (j == M) {
                return i - j; // 匹配成功,返回位置
                j = lps[j - 1];
            } else if (i < N && pattern.charAt(j) != text.charAt(i)) {
                if (j != 0)
                    j = lps[j - 1];
                else
                    i = i + 1;
            }
        }

        return -1; // 匹配失败
    }

    public static void main(String[] args) {
        String text = "ABABDABACDABABCABAB";
        String pattern = "ABABCABAB";
        int index = KMPSearch(text, pattern);
        if (index != -1) {
            System.out.println("Pattern found at index: " + index);
        } else {
            System.out.println("Pattern not found.");
        }
    }
}
  1. Boyer-Moore算法:

Boyer-Moore算法的实现通常比KMP更复杂,因为它使用了一种从右向左比较的策略,并基于坏字符和好后缀规则进行跳转。以下是Boyer-Moore算法的一个简化版本:
当然,我们可以继续实现Boyer-Moore算法的基于坏字符的简化版本。下面是一个完成后的示例代码:

import java.util.Arrays;

public class BoyerMooreAlgorithm {

    // 假设这里只实现了基于坏字符的简化版本
    public static int boyerMooreSearch(String text, String pattern) {
        if (pattern.isEmpty()) {
            return 0; // 空模式在任何位置都匹配
        }

        int[] badChar = new int[256]; // 假设ASCII字符集
        Arrays.fill(badChar, -1);

        // 预处理坏字符表
        for (int i = 0; i < pattern.length(); i++) {
            badChar[pattern.charAt(i)] = i;
        }

        int n = text.length();
        int m = pattern.length();
        int skip;

        // 从文本末尾开始搜索
        for (int i = n - 1; i >= 0; i -= skip) {
            skip = 0; // 重置skip

            // 从右向左比较
            for (int j = m - 1; j >= 0; j--) {
                if (i - j < 0 || pattern.charAt(j) != text.charAt(i - j)) {
                    // 不匹配,根据坏字符表进行跳转
                    skip = Math.max(1, j - badChar[text.charAt(i - j)]);
                    break;
                }
            }

            // 如果j到达-1,则表示匹配成功
            if (j == -1) {
                return i - m + 1; // 返回匹配的起始位置
            }
        }

        // 没有找到匹配项
        return -1;
    }

    public static void main(String[] args) {
        String text = "HERE IS A SIMPLE EXAMPLE TEXT";
        String pattern = "SIMPLE";
        int index = boyerMooreSearch(text, pattern);
        if (index != -1) {
            System.out.println("Pattern found at index: " + index);
        } else {
            System.out.println("Pattern not found.");
        }
    }
}

在上面的代码中,我们首先定义了一个大小为256的badChar数组来存储坏字符表。然后,我们遍历模式字符串来填充这个表,使得badChar[ch]存储的是字符ch在模式字符串中最后出现的位置(如果不存在则为-1)。

在搜索过程中,我们从文本字符串的末尾开始,从右向左与模式字符串进行比较。如果遇到不匹配的字符,我们根据坏字符表来确定下一步应该跳过的字符数。

如果整个模式字符串都与文本字符串的某个子串匹配,那么我们就返回该子串的起始位置。如果搜索完整个文本字符串都没有找到匹配项,我们就返回-1表示未找到。

Boyer-Moore法实现字符串匹配(java) 用Boyer-Moore实现字符串匹配问题。算法中有坏字符移动表和好后缀移动表的创建方法。代码有注视供参考。 立即下载

相关推荐

Boyer-Moore算法

Boyer-Moore字符串搜索算法。它由Bob Boyer和J Strother Moore设计于1977年。此算法仅对搜索目标字符串(关键字)进行预处理,而非被搜索的字符串。虽然Boyer-Moore算法的执行时间同样线性依赖于被搜索字符串的大小,但是通常仅为其它算法的一小部分:它不需要对被搜索的字符串中的字符进行逐一比较,而会跳过其中某些部分。通常搜索关键字越长,算法速度越快。它的效率来自于这样的事实:对于每一次失败的匹配尝试,算法都能够使用这些信息来排除尽可能多的无法匹配的位置。

深入理解Boyer-Moore算法:Java实现与示例

Boyer-Moore算法是一种高效的字符串搜索算法,通过预处理和利用不匹配时的信息,能够加速搜索过程。通过本文的详细解释和完整Java代码示例,希望您能更好地理解和应用这一算法。如果您在实际应用中需要搜索大量文本中的模式字符串,Boyer-Moore算法将是一个强大的工具,为您节省时间和资源。

laterstage的博客 625

电脑蓝牙与ESP32蓝牙连接,让电脑发现ESP32

让PC发现ESP32蓝牙

injre! injre~ 5446

java中字符串匹配算法

这些示例代码展示了朴素模式匹配算法、KMP算法和Boyer-Moore算法的实现。可以根据需要使用适当的算法来进行字符串匹配。

牛肉胡辣汤 2336

SPSS实战:5步搞定多指标联合诊断的ROC曲线分析(附Logistic回归教程)

本文详细介绍了如何使用SPSS软件进行多指标联合诊断的ROC曲线分析。通过5个实战步骤,从数据准备、二元Logistic回归建模生成综合预测概率,到绘制并比较单指标与联合模型的ROC曲线,帮助临床研究者有效整合多个诊断指标,提升模型判别能力(AUC),实现诊断效能的优化。

mqtt6iot的博客 1422

Ubuntu 24.04 高效部署Slurm集群:从零到生产环境实战

本文提供了一份在Ubuntu 24.04 LTS系统上从零开始部署生产级Slurm高性能计算集群的完整实战指南。内容涵盖网络配置、Munge安全认证、Slurm核心组件安装与配置,并深入讲解了cgroups资源隔离、NFS共享存储、配置无感知模式等生产环境优化技巧,最后通过实例演示如何提交与管理Slurm作业,帮助用户构建高效、稳定的计算平台。

weixin_29213655的博客 565

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

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

lhever_的博客 5497

Python实现课程时间表

用Python实现课程表功能

life is like a play 2041

java 字符串匹配算法

本文介绍了四种经典的字符串匹配算法: BF算法:暴力匹配,简单但效率低(O(m*n)); KMP算法:利用前缀表避免回溯,线性时间复杂度(O(m+n)); BM算法:通过坏字符和好后缀规则跳跃匹配,实践中最高效; RK算法:基于哈希值快速比较,适合多模式匹配。 文章还提供了Java枚举实现示例,包含BF的两种实现和简化版RK算法。各算法对比显示,BM适合长文本,RK适用于多模式场景,而KMP提供理论最优解。

qq_39275653的博客 1104

高通410随身WiFi刷OpenWRT与Debian双系统一键集成方案

本文详细介绍高通410随身WiFi设备刷入OpenWRT与Debian双系统的一键集成方案。通过虎王工作室提供的一键刷机包,用户可轻松实现双系统部署,兼顾OpenWRT的网络功能与Debian的完整应用服务,适用于网络加速、服务器部署等多种场景,并提供了硬件资源分配与系统切换的实用指南。

docker7nomad的博客 1138

飞书云文档API操作详细介绍

开通云文档API、python程序调用飞书api、飞书获取app_id和app_secret、

Brother_ning的博客 1万+

Java:对给定的字符串和给定的模式执行Boyer-Moore搜索算法(附带源码)

Java:对给定的字符串和给定的模式执行Boyer-Moore搜索算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1136

后仿真中《SDF反标必懂连载篇》之 探究 SDF延迟精度 与 timescale 精度问题

本篇文章,同样属于后仿真中的SDF反标系列文章内容之一。今天,将前仿真中的timescale 和 后仿真中 timescale+sdf 延迟数据,进行贯通讲解。不要忽视这部分内容,因为后仿真的成功准确与否,时间精度问题,很重要。为什么?接下来一一讲解。

那么菜的博客 2310

Java暴力匹配算法——字符串匹配问题

有一个字符串 str1另和一个字符串 str2 ,通过暴力匹配算法判断 str1 是否含有 str2,如果存在,就返回第一次出现位置的下标,如果没有,则返回-1。

qq_54836465的博客 2039

EDKII环境配置完整版

参考博客【EDK2 UDK2018的环境搭建】:https://blog.csdn.net/qq_39155263/article/details/82965744下载EDK2 1.直接从https://github.com/tianocore/edk2/ 网站下载.zip压缩文件 2.运用svn 从http://svn.code.sf.net/p/edk2/code/trunk/edk2edk2下载 3.安装Visual Studio2017 安装其他Tool 1.IASL 从https..

tianpu2320959696的博客 1854

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

boyer moore算法 java_【模式匹配】更快的Boyer-Moore算法

1. 引言前一篇中介绍了字符串KMP算法,其利用失配时已匹配的字符信息,以确定下一次匹配时模式串的起始位置。本文所要介绍的Boyer-Moore算法是一种比KMP更快的字符串匹配算法,它到底是怎么快的呢?且听下面分解。不同于KMP在匹配过程中从左至右与主串字符做比较,Boyer-Moore算法是从模式串的尾字符开始从右至左做比较。下面讨论的一些递推式都与BM算法的这个特性有关。思想首先,我们一般化...

weixin_35094438的博客 232

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

boyer moore算法 java_Boyer-Moore 算法

一:背景上一篇文章,我介绍了KMP算法。但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法。Boyer-Moore算法不仅效率高,而且构思巧妙。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。二:算法过程(1)假定字符串为"HERE IS A SIMPLE ...

weixin_39834149的博客 329

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

boyer moore算法 java_(转)Boyer-Moore算法

一.简述在当前用于查找子字符串的算法中,BM(Boyer-Moore)算法是当前有效且应用比较广的一中算法,各种文本编辑器的“查找”功能(Ctrl+F),大多采用Boyer-Moore算法。比我们在学习的KMP算法快3~5倍。Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法...

weixin_32709413的博客 314

boyer moore算法 java_Boyer-Moore算法

我们已经讲了字符串匹配算法——Horspool算法,小伙伴们有没有学会啊,今天我们要讲的是一个更复杂一点的Boyer-Moore算法。如果模式最右端的字符和文本中的字符匹配失败,该算法会做出和Horspool算法一样的处理。但是在一个不匹配的字符之前,已经有k (k>0)个字符匹配成功了,这两个算法的处理方式便不一样了。BM算法有两个移动的表对照,分别是坏符号移动表和好后缀移动表。坏符号移动...

weixin_34118050的博客 250

java字符串暴力匹配法代码实现

主要目的是与KMP算法进行比较,回溯次数太多,太低效,仅是一种死路 /** * @author Drug * @create 2020-05-13 15:44 */ public class ViolenceMatch { public static void main(String[] args) { //测试 String str1 = "JavaLoveJaLoveJavaLoveJava"; String str2 = "JavaLove

DrugHua的博客 620

字符串查找匹配算法的一种Java实现

(1)KMP算法       KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。 (2)Sunday算法 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过

一个测试工程师的代码世界 4074

BM算法(Boyer-Moore) (JAVA实现)

BM算法时间上也是O(M+N),而且可以跳着search,但不适合characterset 太小的状况; BM算法主要涉及两个主要步骤:BadCharacter rule 和 Good Suffix rule,并且右后往前比对。 1.建立字符表,坏字符规则(BadCharacter rule): 思想: 字符表中的每个字符在匹配的的规则字符串(pattern)是否出现过,若没有出现,

wxshi的专栏 6779

java 算法实现字符串的匹配

java 算法实现字符串的匹配,自己写的算法。

史上最强的弟子 1502

Java字符串匹配算法

定义 串(string)是由零个或多个字符组成的有限序列又名叫字符串。 一般地,由n个字符串构成的串记作: S=“a0a1…an-1”(n≥0),其中a_i(1≤i≤n) n是个有限的数值 串一般记为S是串的名称,用引号括起来的字符序列是串的值 可以是字母,数字或其他字符,i就是该字符在串中的位置,串中的字符数目n称为串的长度 子串 在对字符串S做处理时,经常需要取出其中某一连续的片段,称为S的子串(substring) 具体地,由串S中起始于位置i的连续k个字符组成的子串记作substr(S,

weixin_51532232的博客 8281

Java实现字符串匹配RK(RabinKarp)算法

前言 写这篇博客主要是因为在看了相关的RK算法原理之后,发现算法都是用C语言实现的。对于习惯使用Java的我来说有点不习惯。所以这里写了一个Java语言版本的实现。 这篇文章不会讲解RK算法的原理,只是Java版本的实现。具体的算法参考了这篇博客 。博客里也详细讲解了RK的原理。 /** * 字符串匹配RK算法,BF算法的升级版本 * Created by LinGer on 2019/7/...

fengpojian的博客 1591
上一篇: 【Java实现查找算法】1.顺序查找2.二分查找 3.哈希查找 4.BFPRT,嘿嘿嘿
下一篇: 【用JAVA实现图论算法】1.最短路径算法(Dijkstra、Floyd-Warshall) 2.最小生成树算法(Prim、Kruskal法) 3.拓扑排序(Topological Sort)
代码无疆
博客等级 码龄3年 4万+粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值