自己写的KMP算法,用来练手
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Created by niweimin on 2014/12/23.
*/
public class KmpMatch {
public String patten;
public int matchTimes;
public KmpMatch(String patten){
this.patten = patten;
}
public static void main(String [] args){
System.out.print("Please input the patten string:");
String patten = "", target = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
patten = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
System.out.print("Please input the target string:");
try {
target = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
KmpMatch match = new KmpMatch(patten);
if(match.findMatch(target)){
System.out.println("Find! Match Times: " + match.matchTimes);
}else{
System.out.println("Not Find!");
}
}
private int[] genNextTable(){
int [] table = new int[patten.length()];
table [0] = -1;
for(int i = 1; i < table.length; i++){
table [i] = next(i);
}
return table;
}
private int next(int j) {
int max = 0;
for(int i = 1; i < j - 1; i++){
if(patten.substring(0, i).equals(patten.substring(j - i, j))){
max = i;
}
}
return max;
}
public boolean findMatch(String target){
int j = 0, next = 0, start = 0, i = start;
int [] table = genNextTable();
while(patten.length() - j <= target.length() - i) {
while (patten.charAt(j) == target.charAt(i)) {
matchTimes++;
if (j == patten.length() - 1) {
return true;
}
i++;
j++;
}
matchTimes++;
next = table[j];
start = start + j - next;
i = start + next;
j = Math.max(0, next);
}
return false;
}
}