【数据结构】KMP算法的java实现

用Java实现该算法如下:

public class KMP {
    public static int[] calculateNext(String pattern){
        int len = pattern.length();
        int[] next = new int[len];
        next[0] = 0;
        int prefix_len = 0; //当前最大相等前后缀长度
        int i = 1;  

        while(i < len){
            if(pattern.charAt(i) == pattern.charAt(prefix_len)){ //后缀末端与前缀末端相等
                prefix_len += 1;  // 前缀长度+1
                next[i] = prefix_len;    
                i++;
            } else { // 后缀末端与前缀末端字符不等
                if(prefix_len == 0){  // 当前前缀长度为0
                    next[i] = 0;
                    i++;
                } else {  // // 当前前缀长度不为0,试图找更小长度的前缀
                    prefix_len = next[prefix_len - 1];  
                }
            }
        }
        return next;
    }
    public static int kmp(String s, String pattern){
        int[] next = calculateNext(pattern);
        int i = 0;  // 指向主串中的位置
        int j = 0;  // 指向模式串中的位置
        while(i < s.length()){
            if(s.charAt(i) == pattern.charAt(j)){
                i++;
                j++;
            } else if(j > 0){  // 字符串不完全失配
                j = next[j-1];  // 将j回退到next[j-1]对应的位置
            } else { // 字符串完全失配:从第一个字符就不一致
                i++;
            }
            if(j == pattern.length())  // 成功匹配
                return i - j;
        }
        return -1;
    }
    public static void main(String[] args) {
        String s = "abcababcabc";
        String pattern = "abcabc";
        int index = kmp(s, pattern);
        System.out.println("字符串为:"+s+"\n"+"模式串为:"+pattern);
        System.out.println("在下标"+index+"处匹配成功");
    }
}

你可能感兴趣的:(数据结构,数据结构,算法,java)