深入理解KMP算法

深入理解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]);
        }
    }
}

画图分析

深入理解KMP算法_第1张图片
对前后缀最大长度的分析

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

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

你可能感兴趣的:(深入理解KMP算法)