有一個文字串S和一個模式串P,要查詢P在S中的位置——KMP演算法
阿新 • • 發佈:2018-11-08
關鍵是求解NEXT陣列 Next陣列就是當前字元之前的字串中,有多大長度的相同字首與字尾
public class KMP { /** * KMP演算法的實現 */ /** * 求解NEXT陣列 */ private static void getNext(char [] p,int [] next){ int len = p.length; next[0]= -1; int k = -1; int j =0; while(j<len-1){ if(k==-1 || p[j]==p[k]){ ++j; ++k; if(p[j]!=p[k]){ next[j] =k; }else{ next[j]=next[k]; } }else{ k=next[k]; } } } public static int KmpSearch(char [] s,char [] p){ int i=0; int j =0; int [] next = new int[p.length]; getNext(p, next); int SLen = s.length; int PLen = p.length; while(i<SLen && j<PLen){ if(j ==-1|| s[i] == p[j]){ i++; j++; }else{ j = next[j]; } } if( j ==PLen){ return i-j; }else{ return -1; } } public static void main(String[] args) { int index = KmpSearch("ADBDGSDFGSD".toCharArray(), "DGS".toCharArray()); System.out.println(index); } }