publicstaticvoidmain(String[] args){ String txt = "我爱北京天安门,天安门在北京,北京城在北方"; String pat = "北京";
// hash值对q取模 int q = 101;
search(pat, txt, q); }
publicstaticvoidsearch(String pat, String txt, int q){ int m = pat.length(); int n = txt.length(); int i, j; int p = 0; // 模式hash值 int t = 0; // 文本hash值 int h = 1;
// 进制数m-1次幂 for (i = 0; i < m - 1; i++) { h = (h * d) % q; }
// 计算第一个窗口hash值 for (i = 0; i < m; i++) { p = (d * p + pat.charAt(i)) % q; t = (d * t + txt.charAt(i)) % q; }
// 滑动窗口匹配 for (i = 0; i <= n - m; i++) {
// 检查模式和当前窗口hash值 if (p == t) { // 检查所有字符 for (j = 0; j < m; j++) { if (txt.charAt(i + j) != pat.charAt(j)) break; }
// p == t and pat[0...m-1] = txt[i, i+1, ...i+m-1] if (j == m) { System.out.println("有效偏移量:" + i); } }
// 计算下一个窗口hash值 if (i < n - m) { t = (d * (t - txt.charAt(i) * h) + txt.charAt(i + m)) % q;