KMP算法

实在愚笨,一直没看懂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数组
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构 第8讲 KMP算法 讲这个算法之前,我们首先了解几个概念: 串:又称字符串,是由零个或多个字符组成的有限...
    rainchxy阅读 5,203评论 0 3
  • 数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章、这篇文章、还有这篇他们写得非常...
    sunhaiyu阅读 5,694评论 1 21
  • 引言 字符串匹配一直是计算机科学领域研究和应用的热门领域,算法的改进研究一直是一个十分困难的课题。作为字符串匹配中...
    潮汐行者阅读 5,641评论 2 6
  • 文章大纲:1.KMP算法概念2.KMP算法中最核心的next[] 数组是如何生成的3.使用KMP算法 匹配字符串 ...
    柠檬乌冬面阅读 4,204评论 0 3
  • 转载请注明出处: KMP算法及优化 今天看到同学在复习数据结构书上的KMP算法,忽然发觉自己又把KMP算法忘掉了,...
    疯狂的爱因斯坦阅读 5,818评论 1 7