当前位置 博文首页 > Aaron_Yang:KMP算法之next数组

    Aaron_Yang:KMP算法之next数组

    作者:[db:作者] 时间:2021-08-01 17:53

    ??????在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大。

    ??????这个next数组的求法是KMP算法的关键,能不能掌握它非常的重要。

    个人总结:

    next【i】是最大相同前后缀的长度,回溯之后i=next【i】, 即新的j指向了前缀 (ab)的后面一个char(c),滑动距离就是i-next【i】,next【i】越小,滑动距离越大,next【i】越大,滑动距离越小。然后就是next【0】设计成-1的精妙之处就是公共部分是i++,j++,如果第一个char就失配,KMP退化成BF,即i=i-j+1,j=0。第一次i++和j++就失配了,失配了去找next【j】嘛,然后j = j-next【0】,next【0】是-1即可。next表的意义就是,j++的时候,如果每次都要向前扫描找是否有相同前后缀并记录长度,这就很难受,因为可以在任意一个时刻失配。

    package com.southwind;
    
    public class next_Array {
        public static void main(String[] args) {
            String str = "abcdabd";
            int next[] = new int[8];
            getNext(str, next);
            for (int a : next)
                System.out.print(a + " ");
        }
    
        public static void getNext(String s, int next[]) {
            int i = -1;   //i前缀
            int j = 0;    //j后缀
            next[0] = -1;
            char a[] = s.toCharArray();
            while (j < a.length) {
                if (i == -1 || a[i] == a[j]) {
                    i++;
                    j++;
                    next[j] = i;
                } else
                    i = next[i];
            }
        }
    
    
    }
    
    

    结果:
    在这里插入图片描述

    cs
    下一篇:没有了