/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package array;
/**
*
* @author liuyuan
*/
public class KMP_practice {
int m, n, f[];
String str, pat;
public KMP_practice(String str, String pat) {
this.str = str;
this.pat = pat;
m = pat.length();
n = str.length();
f = new int[m];
}
public void Fail() {
f[0] = -1;
int i;
for (int j = 1; j < m; j++) {
i = f[j - 1];
while (pat.charAt(j) != pat.charAt(i + 1) && i != -1) {
i = f[i];
}
if (pat.charAt(j) == pat.charAt(i + 1)) {
f[j] = i + 1;
} else {
f[j] = -1;
}
}
}
public int FastFind() {
Fail();
int p = 0, s = 0;
while (p < m && s < n) {
if (pat.charAt(p) == str.charAt(s)) {
p++;
s++;
} else if (p == 0) {
s++;
} else {
p = f[p - 1] + 1;
}
}
if (p == m) {
return s - m;
} else {
return -1;
}
}
public static void main(String[] args) {
KMP_practice test = new KMP_practice("aaaaaba", "ab");
System.out.println(test.FastFind());
}
}