KMP algorithm and kmp algorithm code
Self-written KMP algorithm for hands-on
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; }}