美文网首页
KMP 算法之 next 数组 2.0

KMP 算法之 next 数组 2.0

作者: 蓝笔头 | 来源:发表于2021-08-21 10:08 被阅读0次

leetcode 题目:28. 实现 strStr()

上文 [一文说透] KMP 字符串匹配算法 中的 next 还有优化空间。

next 数组的失配状态转移图

观察上图可以发现,模式串在第 6 位失配时,需要跳转到第 1 位,但是 pattern[6] == pattern[1],因此第 1 位肯定也会失配。

这样就做了无用功。

通过 [一文说透] KMP 字符串匹配算法 的讲解我们知道——next[j] = k 表示模式串在第 j 位和文本串失配后,模式串指针应该跳转到第 k 位。

文本串指针保持不变的情况下,如果 pattern[j] == pattern[k],模式串在第 j 位失配,那么模式串在第 k 位也会失配。

于是我们可以改进计算 next[] 的方法,完整代码如下所示:

    public static int[] getNext(String pattern) {
        int[] next = new int[pattern.length()];

        next[0] = -1;
        int k = -1;
        for (int j = 1; j < pattern.length(); ++ j) {
            // 循环计算
            // 结果(1) 为 k = -1
            // 结果(2) 为 pattern[k] == pattern[j - 1] 时的 k
            while (k >= 0 && pattern.charAt(k) != pattern.charAt(j - 1)) {
                k = next[k];
            }

            // -1 ++ 后等于 0
            // 所以 next[1] 也可以合并到循环中处理
            k ++;

            // 如果 pattern[j] == pattern[k]
            // 那么第 j 位失配的话,第 k 位也会失配
            if (pattern.charAt(j) == pattern.charAt(k)) {
                // 所以让 next[j] = next[k]
                // 从而直接跳过第 k 位的匹配
                next[j] = next[k];
            } else {
                next[j] = k;
            }
        }
        return next;
    }

输出为:

A  B  A B C  A B  A B D 
-1 0 -1 0 2 -1 0 -1 0 4 
next 数组 2.0 的失配状态转移图

参考

相关文章

  • KMP算法

    字符串匹配算法之KMP KMP算法最主要的地方是求next数组,next数组保存的是当前失配节点(下标index)...

  • KMP 算法之 next 数组 2.0

    leetcode 题目:28. 实现 strStr()[https://leetcode-cn.com/probl...

  • 问答|KMP算法学习笔记

    问题 目录KMP是什么,做什么用的KMP算法的高效体现在哪如何KMP算法的next数组KMP的代码KMP的时间复杂...

  • KMP算法理解

    文章大纲:1.KMP算法概念2.KMP算法中最核心的next[] 数组是如何生成的3.使用KMP算法 匹配字符串 ...

  • kmp_algorithm

    tips:kmp算法分两个步骤:1)计算子串的next数组2)匹配子串conclusion:其实求next数组和匹...

  • 数据结构与算法14-字符串匹配与KMP

    什么是KMP KMP算法是在字符串匹配算法中比较绕的.主要是需要理解KMP中next数组求解的必要性以及j 的回溯...

  • 字符串匹配问题-KMP算法

    什么是KMP KMP算法是在字符串匹配算法中比较绕的.主要是需要理解KMP中next数组求解的必要性以及j 的回溯...

  • KMP实现

    kmp next数组 理解

  • KMP字符串匹配算法

    提到kmp算法就不得不说next数组,要得到next数组又不得不去求最大长度表 文本串S acabaabaa...

  • 改进KMP算法

    对KMP算法的改进,主要体现在对next数组的改进上.改进后的next数组 称之为nextval数组减少不必要的比...

网友评论

      本文标题:KMP 算法之 next 数组 2.0

      本文链接:https://www.haomeiwen.com/subject/cdvabltx.html