JAVA實現KMP模式匹配演算法
阿新 • • 發佈:2018-11-14
獲取next()陣列
/** * 獲取next陣列 * data 主字串 * */ public static int[] getNext(String data){ int[] next=new int[data.length()] ; next [0]=0; int index=0; for (int i = 1; i < next.length; i++) { //獲取當前下標的前一位覆蓋表的值 index =next[i-1]; //比較 當前下標的字元與前一位字元的覆蓋表的值對應的字元 if(data.charAt(index)==data.charAt(i)){ //若符合, 當前下標的覆蓋值+1 next[i]=index+1; } else{ //若不符合,當前下標的覆蓋值歸零 next[i]=0; } } return next; }
匹配字串
/** * str 主字串 * date 匹配字串 * */ public static int find(String str,String data){ int[] next=getNext(data); //主字串下標 int i=0; //匹配字串下標 int j=0; //統計匹配成功的次數 int count=0; while(i++<str.length()){ if(count==data.length()){ //返回開始下標 return i+1-count; } if(str.charAt(i)==data.charAt(j)){ j++; count++; }else{ //匹配失敗, 匹配字串下標回朔 j=next[j]; count=j+1; } } return -1; }
測試案例
public static void main(String[] args) {
String res = Arrays.toString(getNext("abcdabd"));
System.out.println("next陣列為:"+res);
int find = find("kajhdabcdabdasdaf","hda");
System.out.println("起始下標為:"+find);
}
輸出結果
next陣列為:[0, 0, 0, 0, 1, 2, 0]
起始下標為:3