public static int getIndexOf(String s, String m) { if (s == null || m == null || m.length() < 1 || s.length() < m.length()) { return -1; } char[] ss = s.toCharArray(); char[] ms = m.toCharArray(); int si = 0; int mi = 0; int[] next = getNextArray(m); while (si < ss.length && mi < ms.length) { if (ss[si] == ms[mi]) { si++; mi++; } else if (next[mi] == -1) { si++; } else { mi = next[mi]; } } return mi == ms.length ? si - mi : -1; } public static int[] getNextArray(String str) { if (str.length() == 1) { return new int[]{-1}; } char[] str2 = str.toCharArray(); int[] next = new int[str.length()]; next[0] = -1; next[1] = 0; int pos = 2; int cn = 0; while (pos < str.length()) { if (str2[pos - 1] == str2[cn]) { next[pos] = cn + 1; pos++; cn++; } else if (cn > 0) { cn = next[cn]; } else { next[pos] = 0; pos++; } } return next; }