public static int KMPmatch(String text, String pattern) {
int n = text.length();
int m = pattern.length();
int[] fail = computeFailFunction(pattern);
int i = 0;
int j = 0;
while (i < n) {
if (pattern.charAt(j) == text.charAt(i)) {
if (j == m - 1)
return i - m + 1; // match
i++;
j++;
}
else if (j > 0)
j = fail[j - 1];
else
i++;
}
return -1; // no match
}
public static int[] computeFailFunction(String pattern) {
int[] fail = new int[pattern.length()];
fail[0] = 0;
int m = pattern.length();
int j = 0;
int i = 1;
while (i < m) {
if (pattern.charAt(j) == pattern.charAt(i)) { // j + 1 characters match
fail[i] = j + 1;
i++;
j++;
}
else if (j > 0) // j follows a matching prefix
j = fail[j - 1];
else { // no match
fail[i] = 0;
i++;
}
}
return fail;
}