KMP算法

2017-08-06  本文已影响0人  vaneL

实在愚笨,一直没看懂KMP算法。
在大神的指点下,终于弄懂了next数组的求解。

参考资料:
严蔚敏的数据结构&大神的指点

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数组
上一篇 下一篇

猜你喜欢

热点阅读