【數據結構與算法】字符串匹配KMP算法

首先需要了解一下BF暴力匹配算法,這個算法爲每一個串設置一個指針,然後兩個指針同時後移,出現不匹配的情況後,主串指針回到開始後移之前的位置的下一位,模式串指針回到最開始

對比一下KMP算法,同樣是設置兩個指針,然後兩個指針同時後移,出現不匹配的情況後,主串指針不變,模式串指針回溯一定的距離。具體模式串指針回溯多少,是第一次看KMP算法的人比較難以理解的,其實仔細想想,模式串的前綴和後綴其實也是在做匹配,當P[K]!=P[J]時就是失配,那麼前綴的指針就需要回溯,所以後k=next[k]

  • 代碼實現

/**
 * 源碼名稱:KMP.java 
 * 日期:2014-09-03 
 * 程序功能:KMP算法 
 * 版權:CopyRight@A2BGeek 
 * 作者:A2BGeek
 */
public class KMP {
	public int[] getNext(String in) {
		int[] next = new int[in.length()];
		int j = 0;
		int k = -1;
		next[j] = k;
		while (j < next.length - 1) {
			if (k == -1 || in.charAt(k) == in.charAt(j)) {
				j++;
				k++;
				next[j] = k;
			} else {
				k = next[k];
			}
		}
		for(int i : next) {
			System.out.print(i + " ");
		}
		System.out.println();
		return next;
	}

	public int kmp(String s, String p) {
		int i = 0;
		int j = 0;
		int[] next = getNext(p);
		while (i < s.length() && j < p.length()) {
			if (j == -1 || s.charAt(i) == p.charAt(j)) {
				i++;
				j++;
			} else {
				j = next[j];
			}
		}
		if (j == p.length()) {
			return 1;
		} else {
			return -1;
		}
	}

	public static void main(String[] args) {
		KMP kmp = new KMP();
		String s = "acbfdfjkdhg";
		String p = "dfdj";
		System.out.println(kmp.kmp(s, p));
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章