返回顶部
首页 > 资讯 > 精选 >Java怎么实现KMP算法
  • 406
分享到

Java怎么实现KMP算法

2023-06-29 05:06:40 406人浏览 独家记忆
摘要

本篇内容主要讲解“Java怎么实现KMP算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现KMP算法”吧!KMP 算法KMP (Knuth-Morris-Pratt), 是一种改

本篇内容主要讲解“Java怎么实现KMP算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现KMP算法”吧!

KMP 算法

KMP (Knuth-Morris-Pratt), 是一种改进的字符串匹配算法. KMP 算法解决了暴力匹配需要高频回退的问题, KMP 算法在匹配上若干字符后, 字符串位置不需要回退, 从而大大提高效率. 如图:

Java怎么实现KMP算法

举个例子 (字符串 “abcabcdef” 匹配字符串 “abcdef”):

次数暴力匹配KMP 算法说明
1abcabcdef abcdefabcabcdef abcdefa 和 a 匹配
2abcabcdef abcdefabcabcdef abcdefab 和 ab 匹配
3abcabcdef abcdefabcabcdef abcdefabc 和 abc 匹配
4abcabcdef abcdefabcabcdef abcdefabca 和 abcd 不匹配, 回退. 暴力匹配回退到索引 1, 即 “b”, KMP 算法索引跳置 3, 即 “a”
5abcabcdef abcdefabcabcdef abcdef暴力匹配 b 和 a 不匹配, 后移. KMP 算法 a 和 a 匹配
6abcabcdef abcdefabcabcdef abcdef暴力匹配 c 和 a 不匹配, 后移. KMP 算法 ab 和 ab 匹配
7abcabcdef abcdefabcabcdef abcdef暴力匹配 a 和 a 匹配. KMP 算法 abc 和 abc 匹配
8abcabcdef abcdefabcabcdef abcdef暴力匹配 ab 和 ab 匹配. KMP 算法 abcd 和 abcd 匹配
9abcabcdef abcdefabcabcdef abcdef暴力匹配 abc 和 abc 匹配. KMP 算法 abcde 和 abcde 匹配
10abcabcdef abcdefabcabcdef abcdef暴力匹配 abcd 和 abcd 匹配. KMP 算法 abcdef 和 abcdef 匹配 , 匹配完成
11abcabcdef abcdefabcabcdef abcdef暴力匹配 abcde 和 abcde 匹配. KMP 算法匹配完成
12abcabcdef abcdefabcabcdef abcdef暴力匹配 abcd 和 abcd 匹配, 匹配完成. KMP 算法匹配完成

部分匹配表

部分匹配表 (Partial Match Table) 指的是 “前缀” 和 “后缀” 的最长共有元素的长度.

举个例子, 字符串 “ABCDABD” 的前缀与后缀:

字符串前缀后缀共同部分
ANaNNaNNaN0
ABABNaN0
ABCA, ABC, BCNaN0
ABCDA, AB, ABCD, CD, BCDNaN0
ABCDAA, AB, ABC, ABCDA, DA, CDA, BCDAA1
ABCDABA, AB, ABC, ABCD, ABCDAB, AB, DAB, CDAB, BCDABAB2
ABCDABA, AB, ABC, ABCD, ABCDA, ABCDABD, BD, ABD, DABD, CDABD, BCDABDNaN0

KMP 算法实现

重点:

KMP 算法中移动的位数 = 已匹配的字符数 - 对应的部分匹配值

import java.util.Arrays;public class KMPMatch {    public static int Match(String str1, String str2, int[] next) {        // 初始化索引        int i = 0;        int j = 0;        for (; i < str1.length(); i++) {            if (j > 0 && str1.charAt(i) != str2.charAt(j)) {                // 不匹配, 回退                i = i - next[j - 1];                j = 0;            }            // 匹配            if (str1.charAt(i) == str2.charAt(j)) {                j++;            }            // 返回索引            if (j == str2.length()) {                return i - j + 1;            }        }        return -1;    }    // 部分匹配    public static int[] getNext(String s) {        // 定义数组        int next[] = new int[s.length()];        // 初始化i, j        int i = 0;        int j = -1;        next[0] = -1;        // 遍历        while (i < s.length() - 1) {            if (j == -1 || s.charAt(i) == s.charAt(j)) {                // 匹配成功                next[i] = j + 1;                i++;                j++;            } else {                //一旦不匹配成功j回退到-1                j = -1;            }        }        return next;    }    public static void main(String[] args) {        // 字符串1        String str1 = "BBCABCDAB ABCDABD";        // 字符串2        String str2 = "ABCDABD";        // 匹配表        int[] next = getNext(str2);        System.out.println(Arrays.toString(next));        // KMP算法        int result = Match(str1, str2, next);        System.out.println(result);    }}

输出结果:

[0, 0, 0, 0, 1, 2, 0]
10

到此,相信大家对“Java怎么实现KMP算法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java怎么实现KMP算法

本文链接: https://lsjlt.com/news/322839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java怎么实现KMP算法
    本篇内容主要讲解“Java怎么实现KMP算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现KMP算法”吧!KMP 算法KMP (Knuth-Morris-Pratt), 是一种改...
    99+
    2023-06-29
  • Java中KMP算法怎么实现
    这篇文章主要介绍“Java中KMP算法怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中KMP算法怎么实现”文章能帮助大家解决问题。图解kmp算法跟之前讲的bm算法思想有一定的相似性。...
    99+
    2023-06-30
  • Java数据结构之KMP算法怎么实现
    这篇文章主要讲解了“Java数据结构之KMP算法怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java数据结构之KMP算法怎么实现”吧!暴力匹配算法(Brute-Force,BF)这...
    99+
    2023-07-04
  • kmp算法python实现
    kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单的办法就是蛮力的一个字符一个字符的匹配,但那样的时间复杂度会是O...
    99+
    2023-01-31
    算法 kmp python
  • C++中怎么实现一个 kmp算法
    本篇文章给大家分享的是有关C++中怎么实现一个 kmp算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++ kmp算法模板参数说明const T *source 待匹配的字...
    99+
    2023-06-17
  • Java数据结构之KMP算法的实现
    目录问题介绍暴力求解知识补充Next示例Next代码匹配示例匹配代码完整代码本次我们介绍数据结构中的KMP算法,我们会从下面几个角度来介绍: 问题介绍 首先我们先介绍适用于KMP算法...
    99+
    2022-11-21
    Java KMP算法 Java KMP
  • 详解Java中KMP算法的图解与实现
    目录图解代码实现图解 kmp算法跟之前讲的bm算法思想有一定的相似性。之前提到过,bm算法中有个好后缀的概念,而在kmp中有个好前缀的概念,什么是好前缀,我们先来看下面这个例子。 ...
    99+
    2024-04-02
  • java 中模式匹配算法-KMP算法实例详解
    java 中模式匹配算法-KMP算法实例详解朴素模式匹配算法的最大问题就是太低效了。于是三位前辈发表了一种KMP算法,其中三个字母分别是这三个人名的首字母大写。简单的说,KMP算法的对于主串的当前位置不回溯。也就是说,如果主串某次比较时,当...
    99+
    2023-05-31
    java kmp ava
  • Java数据结构之KMP算法详解以及代码实现
    目录暴力匹配算法(Brute-Force,BF)概念和原理next数组KMP匹配KMP全匹配总结我们此前学了前缀树Trie的实现原理以及Java代码的实现。Trie树很好,但是它只能...
    99+
    2022-12-08
    Java 数据结构 KMP算法 Java KMP算法 Java KMP
  • Java数据结构与算法系列精讲之KMP算法
    概述 从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章. KMP 算法 KMP (Knuth-Morris-Pratt), 是一种改进的字符串匹配算法...
    99+
    2024-04-02
  • Java RSA算法怎么实现
    Java中可以使用Java内置的加密库javax.crypto来实现RSA算法。 下面是一个简单的RSA加密和解密的示例代码: im...
    99+
    2023-10-26
    Java
  • Java数据结构彻底理解关于KMP算法
    大家好,前面的有一篇文章讲了子序列和全排列问题,今天我们再来看一个比较有难度的问题。那就是大名鼎鼎的KMP算法。 本期文章源码:GitHub源码 简介 KMP算法是一种改进的字符串...
    99+
    2024-04-02
  • java寻路算法怎么实现
    Java中的寻路算法可以使用图的搜索算法来实现。以下是一个简单的示例,使用BFS(广度优先搜索)算法来寻找路径。```javaimp...
    99+
    2023-09-22
    java
  • Java怎么实现抽奖算法
    本篇内容主要讲解“Java怎么实现抽奖算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现抽奖算法”吧!一、题目描述题目: 小虚竹为了给粉丝送福利,决定在参与学习打卡活动的粉丝中抽...
    99+
    2023-06-30
  • Java C++题解leetcode字符串轮转KMP算法详解
    目录题目要求思路一:双指针(模拟)JavaC++思路二:子串手写KMPJavadpC++dp调APIJavaC++总结题目要求 思路一:双指针(模拟) Java class Sol...
    99+
    2024-04-02
  • java全排列算法怎么实现
    以下是一种实现Java全排列算法的方法:```javaimport java.util.ArrayList;import java....
    99+
    2023-09-26
    java
  • Java怎么实现排序算法Timsort
    这篇文章主要介绍“Java怎么实现排序算法Timsort”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么实现排序算法Timsort”文章能帮助大家解决问题。背景Timsort 是一个混合、...
    99+
    2023-07-02
  • Java怎么用位运算实现乘法运算
    这篇文章主要介绍了Java怎么用位运算实现乘法运算的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么用位运算实现乘法运算文章都会有所收获,下面我们一起来看看吧。十进制相乘例如,26 * 15,在进行乘法...
    99+
    2023-07-06
  • Java常见排序算法怎么实现
    本文小编为大家详细介绍“Java常见排序算法怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java常见排序算法怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。汇总:1. 冒泡排序每轮循环确定最值;...
    99+
    2023-06-29
  • Java十大排序算法怎么实现
    本篇内容介绍了“Java十大排序算法怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!排序算法的稳定性:  &nbs...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作