与传统的字符串匹配(BF算法)相比,进行了进一步改进, 即做一个标记数组,使得每次匹配失败回溯的时候回溯到前面相同的部分。
ababcababa 和 ababa 进行匹配。 因为t 字符串有重复的部分,因此每次回溯时候不用完全回溯, 只回溯到next[j] 位置即可。
P a b a b a
j 0 1 2 3 4
next -1 0 0 1 2
package KMP;
public class Solution {
public int KMP(String s, String t){
int[] next = new int[t.length()];
nextGenerate(t, next);
int i = 0;
int j = 0;
while(i < s.length()){
if(j == -1 || s.charAt(i) == t.charAt(j)){
i++;
j++;
}else{
j = next[j];
}
if(j == t.length()){
return i - j;
}
}
return -1;
}
private void nextGenerate(String t, int[] next){
next[0] = -1;
for(int i = 1; i < t.length() - 1; i++){
if(t.charAt(i) == t.charAt(next[i])){
next[i + 1] = next[i] + 1;
}else {
next[i + 1] = 0;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution solution = new Solution();
String s = "ababcababa";
String t = "ababa";
System.out.println(solution.KMP(s, t));
}
}