KMP算法

作者: vaneL | 来源:发表于2017-08-06 11:09 被阅读0次

实在愚笨,一直没看懂KMP算法。
在大神的指点下,终于弄懂了next数组的求解。

  • next[i]的含义是在ms[i]之前的字符串ma[0..i-1]中,必须以ms[i-1]结尾的后缀子串与必须以ms[0]开头的前缀子串最大匹配长度是多少。
  • 当ss[j]!=ms[j-i]时,在ss中要匹配的位置仍是j不进行回退;而ms向又滑动,让ms[k]滑动到与str[j]同一个位置上,继续后续的匹配检查。

参考资料:
严蔚敏的数据结构&大神的指点

public static int getIndexOf(String s ,String m){
        if (s == null || m == null || m.length() > s.length() || m.length() < 1) {
            return 0;
        }
        char[] ss = s.toCharArray();
        char[] ms= m.toCharArray();
        int si =0;
        int mi =0;
        int[] next = getNextArray(ms);
        while (si < ss.length && mi < ms.length) {
            if (ss[si] == ms[mi] || mi == 0) {  //当ss与ms匹配或mi为0
                si++;
                mi++;
            } else {   //ss不动,ms滑动
                mi = next[mi];
            }
        }
        return mi == ms.length ? si - mi : 0;
    }

    public static int[] getNextArray(char[] ms) {
        /**
         * 当Pk=Pj,next[j+1]=next[j]+1
         * 当Pk!=Pj,next[j+1]=next[k]+1
         */
        int i=1,j=0;
        int[] next = new int[ms.length+1];   //next[0]没有作用
        next[1]=0;
        while (i<ms.length){
            if (j == 0 || ms[i] == ms[j]) {  
                ++i;++j;
                next[i]=j;
            }else {
                j=next[j];
            }
        }
        return next;

下面是一个求next数组的例子:
match:abaabcac
next[j]:01122312

求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/ozeglxtx.html