kmp算法

作者: 小xuer | 来源:发表于2018-07-08 23:45 被阅读0次

精华之处:求next数组(自动机)

KMP与getNext方法相同,只有 next[suffix] = prefix;  //1不同

next数组求解方法:

1.覆盖表:求前缀、后缀公共部分最大长度

2.next数组为覆盖表右移一位。

public class KMP {

    public static int KMP(String s, String t) {

        int i = 0;

        int j = 0;

        //得到next数组

        int[] next = getNext(t);

        while (i < s.length() && j < t.length()) {

            if (j == -1 || s.charAt(i) == t.charAt(j)) {

                i++;

                j++;

            }else {

                //根据next数组的指示j进行回溯,而i永远不会回溯

                j = next[j];

            }

        }

        if (j == t.length()) {

            return i - j;

        }else {

            return -1;

        }

    }

    /**

     * next指的是KMP主算法中的j该回溯到哪个位置

     *其值就是当前位置之前的可覆盖子串最大长度;

     *

     *所以代码就是找可覆盖子串的最大长度,

     *其实就是:模式串自己对自己的匹配

     *用prefix所指的串去匹配suffix所指的串

     *所以代码和kmp的主算法是类似的

     * @param t

     * @return

     */

    public static int[] getNext(String t) {

        int[] next = new int[t.length()];

        next[0] = -1;

        int suffix = 0;  // 后缀

        int prefix = -1;  // 前缀

        while (suffix < t.length() - 1) {

            //若前缀索引为-1或相等,则前缀后缀索引均+1

            if (prefix == -1 || t.charAt(prefix) == t.charAt(suffix)) {

                ++prefix;

                ++suffix;

                next[suffix] = prefix;  //1

            }else {

                prefix = next[prefix];  //2

            }

        }

        return next;

    }

    /**

     *改进的就是可覆盖子串的后一项,可能和当前项一样

     *如ABCDABD,第二个AB不该是0,1,而是-1,0

     * @param t

     * @return

     */

    public static int[] getNext2(String t) {

        int[] next = new int[t.length()];

        next[0] = -1;

        int suffix = 0;  // 后缀

        int prefix = -1;  // 前缀

        while (suffix < t.length() - 1) {

            //若相等或前缀索引为-1,则前缀后缀索引均+1

            if (prefix == -1 || t.charAt(prefix) == t.charAt(suffix)) {

                ++prefix;

                ++suffix;

                //改进的地方

                if (t.charAt(prefix) == t.charAt(suffix)) {

                    next[suffix] = next[prefix];

                }else {

                    next[suffix] = prefix;

                }

            }else {

                prefix = next[prefix];

            }

        }

        return next;

    }

}

相关文章

  • KMP 专题整理

    KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...

  • 对KMP算法的一些理解

    最近学到KMP算法,下面讲讲对KMP算法的一些个人理解,希望对大家有帮助! 对于KMP算法的理解: 整个KMP算法...

  • KMP算法文章合集

    字符串的查找:朴素查找算法和KMP算法 暴力匹配算法与KMP算法(串的匹配) 字符串查找算法BF和KMP 字符串匹...

  • 串的模式匹配算法

    KMP算法 算法匹配

  • 问答|KMP算法学习笔记

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

  • KMP算法——寻找子串位置

    KMP算法——寻找子串位置 1、KMP算法简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • 字符串匹配 - KMP算法

    前面我们介绍非常高效的 BM 算法,今天我们介绍另一个非常出名且高效的 KMP 算法。 KMP 算法思想 KMP ...

  • KMP算法及优化

    转载请注明出处: KMP算法及优化 今天看到同学在复习数据结构书上的KMP算法,忽然发觉自己又把KMP算法忘掉了,...

  • KMP算法(字符串匹配问题)

    一、是什么? 注意,是KMP算法,不是MMP哈,我没有骂人。KMP算法是用来做字符串匹配的,除了KMP算法分,还有...

  • KMP算法

    KMP算法

网友评论

      本文标题:kmp算法

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