Java十大经典算法—KMP

这篇具有很好参考价值的文章主要介绍了Java十大经典算法—KMP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

字符串匹配问题:

Java十大经典算法—KMP,java,算法,开发语言

1.暴力匹配

Java十大经典算法—KMP,java,算法,开发语言

public class ViolenceMatch {
    public static void main(String[] args) {
        String str1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";
        String str2 = "尚硅谷你尚硅你好";
        int index = violenceMatch(str1, str2);
        System.out.println("index=" + index);
    }

    //暴力匹配算法
    public static int violenceMatch(String str1, String str2) {
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        int s1Len =s1.length;
        int s2Len =s2.length;

        int i = 0;//i索引指向s1
        int j = 0;//j索引指向s2
        while (i < s1Len && j < s2Len) {
            if (s1[i] == s2[j]) {
                i++;
                j++;
            }else {
                //如果匹配指令失败,令i=i-(j-1)【向后移一位】,j=0
                i=i-(j-1);
                j=0;
            }
        }
        if (j == s2Len) {
            return i-j;
        }else {
            return -1;
        }

    }
}

2.KMP算法 

概念

Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的出现位置,这个算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的姓氏命名此算法.

KMP 方法算法就利用之前判断过信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过 next 数组找到,前面匹配过的位置,省去了大量的计算时间

key:next数组、KMP搜索🔍文章来源地址https://www.toymoban.com/news/detail-784723.html

流程与关键图解

流程图解
Java十大经典算法—KMP,java,算法,开发语言关键图解——匹配表Java十大经典算法—KMP,java,算法,开发语言
代码(核心点待理解)
import java.util.Arrays;

public class KMP {
    public static void main(String[] args) {
        int[]next = kmpNext("ABCDABD");
        System.out.println("next"+ Arrays.toString(next));

    }

    /**
     *
     * @param str1 源字符串
     * @param str2 子串
     * @param next 部分匹配值表
     * @return 如果是-1 就是没有匹配到,否则返回第一个匹配的位置
     */
    public static int kmpSearch(String str1,String str2,int[]next){
        //遍历
        for (int i = 0,j=0; i < str1.length(); i++) {
            //需要处理 str1.charAt(i) != str2.charAt(j), 去调整 j 的大小
            //KMP 算法核心点, 可以验证..
            while(j>0&&str1.charAt(i)!=str2.charAt(j)){
                j=next[j-1];
            }
            if (str1.charAt(i)==str2.charAt(j)){
                j++;
            }
            if (j==str2.length()){
                return i-j+1;
            }
        }
        return -1;
    }

    //获取字符串的部分匹配值表
    public static int[] kmpNext(String dest){
        //创建一个next数组保存部分匹配值
        int[]next=new int[dest.length()];
        next[0]=0;//如果匹配字符串长度位1,部分匹配值就为0
        for (int i = 1,j=0; i <dest.length(); i++) {
            //当 dest.charAt(i) != dest.charAt(j) ,我们需要从 next[j-1]获取新的 j
            //直到我们发现 有 dest.charAt(i) == dest.charAt(j)成立才退出
            //这时 kmp 算法的核心点
            while (j>0&&dest.charAt(i)!=dest.charAt(j)){
                j=next[j-1];//???
            }
            //当 dest.charAt(i) == dest.charAt(j) 满足时,部分匹配值就是+1
            if (dest.charAt(i)==dest.charAt(j)){
                j++;
            }
            next[i]=j;
        }
        return next;
    }

}

到了这里,关于Java十大经典算法—KMP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十大排序算法及Java中的排序算法

    常见的排序算法有十种,可以分为以下两大类: 非线性时间比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(n log n),因此称为非线性时间比较类排序 线性时间非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时

    2024年02月08日
    浏览(46)
  • 机器学习之十大经典算法

    机器学习算法是计算机科学和人工智能领域的关键组成部分,它们用于从数据中学习模式并作出预测或做出决策。本文将为大家介绍十大经典机器学习算法,其中包括了线性回归、逻辑回归、支持向量机、朴素贝叶斯、决策树等算法,每种算法都在特定的领域发挥着巨大的价

    2024年02月15日
    浏览(43)
  • 机器学习十大经典算法

    机器学习算法是计算机科学和人工智能领域的关键组成部分,它们用于从数据中学习模式并作出预测或做出决策。本文将为大家介绍十大经典机器学习算法,其中包括了线性回归、逻辑回归、支持向量机、朴素贝叶斯、决策树等算法,每种算法都在特定的领域发挥着巨大的价

    2024年02月14日
    浏览(42)
  • 十大经典排序算法

    1、 冒泡排序(Bubble Sort):相邻元素比较,逐步将最大元素“冒泡”到序列最后。时间复杂度O(n^2)。 2、选择排序(Selection Sort):从序列中选择最小的元素,放到序列的起始位置,再从剩余元素中选择最小的元素放到已排序序列的末尾。时间复杂度O(n^2)。 3、插入排序(In

    2024年02月09日
    浏览(40)
  • 十大经典排序算法(上)

    目录 1.1冒泡排序 1. 算法步骤  3.什么时候最快 4. 什么时候最慢 5.代码实现 1.2选择排序 1. 算法步骤  2. 动图演示 3.代码实现  1.3 插入排序 1. 算法步骤 2. 动图演示 3. 算法实现 1.4 希尔排序 1. 算法步骤 2. 动图演示  3.代码实现 1.5 归并排序 1. 算法步骤  2. 动图演示  3.代码实现

    2024年02月02日
    浏览(37)
  • 数学建模十大经典算法和常用算法

    1、蒙特卡罗算法: 该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时通过模拟可以来检验自己模型的正确性。 2、数据拟合、参数估计、插值等数据处理算法: 比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于算法,通常使用Matlab作为

    2024年02月07日
    浏览(46)
  • 数据挖掘领域十大经典算法

    数据挖掘是人工智能和数据库领域研究的热点问题,所谓数据挖掘是指从数据库的大量数据中揭示出隐含的、先前未知的并有潜在价值的信息的非平凡过程。数据挖掘是一种决策支持过程,它主要 基于人工智能、机器学习、模式识别、统计学、数据库、可视化技术 等,高度

    2024年02月08日
    浏览(70)
  • 十大排序——11.十大排序的比较汇总及Java中自带的排序算法

    这篇文章对排序算法进行一个汇总比较! 目录 0.十大排序汇总 0.1概述 0.2比较和非比较的区别 0.3基本术语 0.4排序算法的复杂度及稳定性 1.冒泡排序 算法简介 动图演示 代码演示 应用场景 算法分析 2.快速排序 算法简介 动图演示 代码演示 应用场景 算法分析 3.插入排序 算法简

    2024年04月29日
    浏览(39)
  • 十大排序算法(java实现万字详解)

    排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 八大排序都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: 什么是排序的稳定性? 稳定性:假定在待排序的记录序列中,存

    2024年02月20日
    浏览(35)
  • 十大经典排序算法----堆排序(超详细)

    目录 1. 堆排序的基础知识 1.1 大顶堆小顶堆  1.2 向下调整算法 1.3 物理结构与逻辑结构的关系 2. 堆排序详解 2.1 堆排序整体思路  2.2 思路详解 2.2.1 建堆 2.2.2 大堆or小堆 2.2.3 输出数据 3. 时间复杂度分析 4. 完整代码  5. 彩蛋 堆排序(Heap Sort)就是对直接选择排序的

    2024年02月03日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包