kmp算法

Posted barrysgy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kmp算法相关的知识,希望对你有一定的参考价值。

具体参考https://www.cnblogs.com/ciyeer/p/9035072.html

/**
     * 创建next数组(数组第0位没作用, 从第1位才是有效位)
     * @param pattern
     * @return
     */
    static int[] makeNext(String pattern)
    
        char[] chars = pattern.toCharArray();
        int[] next = new int[chars.length + 1];
        int i = 1;
        next[1] = 0;
        int j = 0;
        while (i < chars.length)
        
            if (j == 0 || chars[i-1] == chars[j-1])
            
                i++;
                j++;
                next[i] = j;
            
            else
            
                j = next[j];
            
        
        return next;
    

    /**
     * kmp方法查询字符串(快速模式匹配算法)
     * 源字符串中的索引i不会回溯, 比对字符串时
     * 找到不一样的, 移动模式串的索引j来与源串中i位置再继续比较
     * @param src
     * @param pattern
     * @return
     */
    public static int kmpFindStr(String src, String pattern) 
        int[] next = makeNext(pattern);
        char[] s = src.toCharArray();
        char[] t = pattern.toCharArray();
        //j为模串的索
        int j = 0;
        //i为源字符串的索引
        for(int i = 0; i < s.length;) 
            if(j == 0 || t[j] == s[i]) 
                i++;
                j++;
                if(j >= t.length) 
                    //找到了
                    return i - j;
                
            
            else 
                //两个值不一样, 修改j的跳转位置
                j = next[j];
            
        
        return -1;
    

    /**
     * 测试
     *
     * @param args
     */
    public static void main(String[] args) 
        int index = kmpFindStr("abf55abaabaca11", "abaabaca");
        System.out.print(index);
    

 

以上是关于kmp算法的主要内容,如果未能解决你的问题,请参考以下文章

什么是KMP算法?KMP算法推导

KMP算法及KMP算法的应用(POJ2406)

KMP算法

kmp算法

kmp算法

KMP算法