KMP算法

98 阅读1分钟
//求解长度为len的字符串s的next数组
public int[] getNext(char[] s, int len){
    int[] next=new int[len];
    int j=-1;
    next[0]=-1;
    for(int i=1;i<len;i++){
        while(j>=0&&s[i]!=s[j+1]){
            j=next[j];
        }
        if(s[i]==s[j+1]){
            j++;
        }
        next[i]=j;
    }
    return next;
}
//
public boolean KMP(char[] text, char[] pattern){
    int n=text.length;
    int m=pattern.length;
    getNext(pattern, m);
    int j=-1;
    for(int i=0;i<n;i++){
        while(j!=-1&&text[i]!=pattern[j+1]){
            j=next[j];
        }
        if(text[i]==pattern[j+1]){
            j++;
        }
        if(j==m-1){
            return true;
        }
    }
    return false;
}
public boolean KMP(char[] text, char[] pattern){
    int n=text.length;
    int m=pattern.length;
    getNext(pattern, m);
    int j=-1;
    int ans=0;
    for(int i=0;i<n;i++){
        while(j!=-1&&text[i]!=pattern[j+1]){
            j=next[j];
        }
        if(text[i]==pattern[j+1]){
            j++;
        }
        if(j==m-1){
            ans++;
            j=next[j];
        }
    }
    return ans;
}