KMP算法

KMP算法

next数组

next[1]=0,next[2]=1

当第j个字符匹配失败,主串指针i不回溯,只改变模式串中的j指针,

由前1到j-1个字符组成的串记为S,则next[j]=S的最长相等前后缀长度+1

time complexity: O(n+m)

public static int KMP(String s,String t)
    {
        int[] next=new int[t.length()];
        get_next(t,next);
        int i=0,j=0;
        while(i<s.length()&&j<t.length())
        {
            if(j==-1 || s.charAt(i)==t.charAt(j))
            {
                i++;
                j++;
            }
            else j=next[j];
        }
        if(j>=t.length())
            return (i-t.length());
        else
            return (-1);
    }


    public static int[] get_next(String t,int[] next)
    {
        int j=0,k=-1;
        next[0]=-1;
        while(j<t.length()-1)
        {
            if(k == -1 || t.charAt(j) == t.charAt(k))
            {
                j++;
                k++;
                next[j] = k;
            }
            else k = next[k];
        }
        return next;
    }

 

posted @ 2021-10-20 19:04  梦想家肾小球  阅读(25)  评论(0编辑  收藏  举报