public static int indexBF(String s, String t) { int i = 0; int j = 0; while (i < s.length() && j < t.length()) { if (s.charAt(i) == t.charAt(j)) { ++i; ++j; } else { i = i - j + 1; j = 0; } } if (j > t.length() - 1) { return i - t.length(); } else { return -1; } } public static int[] nextVal(String t) { int len = t.length(); int next[] = new int[len]; int i = 0; int j = -1; while (i < len - 1) { if (j == -1 || (t.charAt(i) == t.charAt(j))) { i++; j++; if (t.charAt(i) != t.charAt(j)) { next[i] = j + 1; } else { next[i] = next[j] + 1; } } else { j = next[j] - 1; } } return next; } public static int indexKMP(String s, String t, int[] next) { int i = 0; int j = 0; while (i < s.length() - 1 && j < t.length() - 1) { if (j == 0 || (s.charAt(i) == t.charAt(j))) { i++; j++; } else j = (next[j] - 1); } if (j > t.length() - 2) { return (i - t.length() + 1); } else return -1; } public static void main(String[] args) { System.out.println(indexBF("aaabaabcaabd", "aaba")); int[] next = nextVal("aaba"); for (int i = 0; i < next.length; i++) { System.out.print(next[i]); } System.out.println(""); System.out.println(indexKMP("aaabaabcaabd", "aaba", next)); }