KMP算法--通俗易通

public class KMPAlgorithm {
    public static void main(String[] args) {
        String str1 = "BBC ABCDAB ABCDABCDABDE";
        String str2 = "ABCDABD";
        int[] kmpTable = kmpTable(str2);
        System.out.println(Arrays.toString(kmpTable));
    }

    public static int[] kmpTable(String dest) {

        int next[] = new int[dest.length()];
        next[0] = 0; // 如果字符的长度为1,则部分匹配值就是0
        for (int i = 0, j = 1; j < dest.length(); j++) {            //ABCDABD

            while (i > 0 && dest.charAt(i) != dest.charAt(j)) {
                i = next[i - 1];
            }

            if (dest.charAt(i) == dest.charAt(j)) { //
                i++;
            }

            next[j] = i;
        }

        return next;
    }
}

原文地址:https://www.cnblogs.com/MrRightZhao/p/12116915.html

时间: 2024-07-31 07:36:26

KMP算法--通俗易通的相关文章

冒泡算法--通俗易通

一.冒泡算法介绍 定义: 通过对无序数组列表的下标开始依次对相邻元素的值进行比较,若发现逆序则交换,使较大的元素逐渐从前向移,就像水底的气泡一样逐渐向上冒泡. 冒泡算法分为2种: 1.一种是利用内.外循环的脚标来确定二个数,进行比较. 2.另一种是利用内存循环的脚标.内循环脚标+1来确定2个数,来进行比较 二.代码实现 1.分步实现 2.整体实现 3.优化步骤 分步实现过程 package com.zpb.bubbling; import java.util.Arrays; /** * @des

2019最新设计模式(最通俗易通)

课程目录:0-设计模式前言Singleton-单例模式-第一模式1-strategy_策略模式-第二模式2-strategy_策略模式-第二模式3-strategy_策略模式-第二模式4-strategy_策略模式-第二模式5-strategy_策略模式-第二模式6-Factory_1-第三第四模式7-Factory_2-第三第四模式8-Factory_3-第三第四模式9-门面与调停者-第五模式-第六模式10-门面与调停者_2-第五模式-第六模式11-Decorator_装饰器-第七模式12-详

KMP算法通俗讲解

最近对KMP算法好奇,这算法完全没印象(学校教过,但我没学,因为逃课),也不是还给了老师.只是想跳槽的话,听说都得明白这玩意. 在网上找了一篇文章,这哥们应该算是比较出名的,http://www.matrix67.com/blog/archives/115. 刚开始看,一个字“晕”.什么kmp,bf,bm,头都看疼了.仔细看了后才明白.下面说说bf与kmp,没有代码,尽量通俗点讲解. bf不细说了,这是相当"通俗"及自然(我自己形容为原始想法)的想法,从头到尾比较字符串,不相等则从头再

KMP算法的next[]数组通俗解释

我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容. 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大.

(收藏)KMP算法的前缀next数组最通俗的解释

我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容. 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大.

不能更通俗了!KMP算法实现解析

我之前对于KMP算法理解的也不是很到位,如果很长时间不写KMP的话,代码就记不清了,今天刷leetcode的时候突然决定干脆把它彻底总结一下,这样即便以后忘记了也好查看.所以就有了这篇文章. 本文在于帮助大家理解KMP算法的编码实现,假设大家已经明白了KMP算法的原理.如果还不太理解,请参考阮一峰老师的这篇博文,写的不能更清楚了:) 好吧,现在让我们正式开始. 首先,我们要简单回顾一下KMP算法的流程,假设要在串s中找串p,如下图所示.现在已经匹配了有一段了(绿色部分),但是在某个地方发生了失配

[转]一个比较通俗的KMP算法讲解

最近在学字符串匹配的时候接触了这个算法,算法书上都是我讨厌的下标,转来转去,头晕啊.只好上网搜一下,大部分跟书上一样,好不容易找到一篇,总算看得有些懂了.      其实最简单的字符串匹配,就是逐个逐个比较,但是这样的效率很低,而KMP算法利用了......(不说了,表达能力差啊,^_^,看看牛人怎么解释的吧). 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串

字符串模式匹配KMP算法中的next数组算法及C++实现

一.问题描述: 对于两个字符串S.T,找到T在S中第一次出现的起始位置,若T未在S中出现,则返回-1. 二.输入描述: 两个字符串S.T. 三.输出描述: 字符串T在S中第一次出现的起始位置,若未出现,则返回-1. 四.输入例子: ababaababcbababc 五.输出例子: 5 六.KMP算法解析: KMP算法分为两步,第一步是计算next数组,第二步是根据next数组通过较节省的方式回溯来比较两个字符串. 网络上不同文章关于next数组的角标含义略有差别,这里取参考文献中王红梅<数据结构

KMP算法 - 求最小覆盖子串

KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab",它的最小覆盖子串p="abc",因为p通过在它后面再接上一个p(即重叠0个字符),可以得到q="abcabc",此时s是q的子串. 对于s="ababab",它的最小覆盖子串为p="ab". 根据KMP算法的next数组的定