public class KMP {    public static void main(String[] args) {        String string = "abxabcabcaby";        String pattern = "abcaby";        int[] next = KMP_next(pattern);        System.out.println(Arrays.toString(next));        int searchRes = KMP_search(string, pattern, next);        System.out.println(searchRes);    }    public static int[] KMP_next(String p){        //初始化next数组        int[] next = new int[p.length()];        //数组第一位肯定是0        next[0] = 0;        int j = 0, i = 1;        while (i < next.length) {            if (p.charAt(i) == p.charAt(j)){                ++j;                next[i] = j;                i++;            } else {                if (j == 0) {                    next[i] = j;                    i++;                    continue;                }                j = next[j - 1];            }        }        return next;    }    public static int KMP_search(String s, String p, int[] next){        int i = 0, j = 0;        while (i < s.length()){            if (j == p.length() - 1 && s.charAt(i) == p.charAt(j)){                return i - j;            }            if (s.charAt(i) == p.charAt(j)){                i++;                j++;            } else {                if (j == 0){                    i++;                    continue;                }                j = next[j - 1];            }        }        return -1;    }}