美文网首页
深入理解KMP算法

深入理解KMP算法

作者: pianpianboy | 来源:发表于2018-03-13 11:08 被阅读0次

深入理解KMP算法

时间:20180313


KMP算法的核心是 求公共最大前后缀。

public class Prefix {
    //求前缀后缀的最长子串
    public static int [] getPrefix(char patern[]){
        int [] prefix = new int [patern.length];
        //第一个前后缀最长子缀为0
        prefix[0] = 0;
        int i = 1;
        while(i < patern.length){
            //System.out.println("i: "+ i +" prefix[i] : "+ prefix[i]);
            //正常情况下:当前值(第i个值)等于前面一串的字符串已知prefix[i-1]的情况下去判断
            //当前值patern[i]与patern[prefix[i-1]]的大小,若相等则在patern[prefix[i-1]]基础上加1
            //若不相等继续进行判断,判断逻辑见画图分析
            if(patern[i] == patern[prefix[i-1]]){
                prefix[i] = prefix[i-1] + 1;
                i++;
            }else{
                //处理当前值patern[i]与patern[prefix[i-1]]不相等的情况
                if(prefix[i-1] > 0){
                    //取得右偏一位后值的最大公共前后缀
                    prefix[i] = prefix[prefix[i-1]-1];
                    i++;
                }else{
                    prefix[i] = 0;
                    //防止死循环
                    i++;
                }
            }
        }
        return prefix;
    }
    
    //将prefix数组中的值逐步向后移动一位
    public static int[] movePrefix(int[] prefix){
        for(int i= prefix.length-1; i > 0; i--){
            prefix[i] = prefix[i-1];
        }
        prefix[0] = -1;
        return prefix;
    }

    public static void main(String[] args) {
        String s = "ABABCABAA";
        System.out.println(s);
        char [] patern = s.toCharArray();
        int [] res = getPrefix(patern);
        res = movePrefix(res);
        for(int i = 0; i < res.length; i++){
            System.out.println(res[i]);
        }
    }
}

画图分析

对前后缀最大长度的分析

继续分析如何利用前后缀最大长度数组进行字符串匹配的过程

参考
https://search.bilibili.com/all?keyword=kmp&from_source=banner_search
https://www.bilibili.com/video/av16828557/?from=search&seid=4786796467366856321

相关文章

  • 深入理解KMP算法

    深入理解KMP算法 时间:20180313 KMP算法的核心是 求公共最大前后缀。 画图分析 继续分析如何利用前后...

  • 对KMP算法的一些理解

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

  • KMP算法学习札记

    参考文章 知乎:如何更好的理解和掌握 KMP 算法?从头到尾彻底理解KMPKMP 算法(1):如何理解 KMP(原...

  • KMP算法 理解与实现

    KMP算法,背景不必多说,主要想写一写自己对KMP算法的一些理解和其具体实现。关于KMP算法的原理,阮一峰老师的这...

  • 理解字符串匹配KMP算法的一些细节

    阮一峰的这篇文章,字符串匹配的KMP算法,能够很好地帮助我们理解KMP的大致思路。如果需要从原理上更深入和全面的理...

  • KMP算法

    参考文献1.B站灯笼哥2.KMP算法python实现3.如何更好的理解和掌握 KMP 算法?

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

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

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

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

  • KMP 专题整理

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

  • 理解 KMP 算法

    1. 概述 字符串是编程中常用的一种数据结构,在各个方面都有广泛的应用,而字符串的一种基本操作就是给定一段长度为N...

网友评论

      本文标题:深入理解KMP算法

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