五大匹配算法
五大匹配算法 BF 匹配、RK 匹配、KMP 匹配、BM 匹配、Sunday 匹配。
1、BF 匹配
// BF 匹配(暴力匹配)
public static int bfMatch(String text, String pattern) {char[] t = text.toCharArray();char[] p = pattern.toCharArray();int i = 0, j = 0;while (i < t.length && j < p.length) {if (t[i] == p[j]) {i++;j++;} else {i = i - j + 1;j = 0;}}if (j == p.length) {return i - j;} else {return -1;}
}
2、RK 匹配
// RK 匹配(哈希匹配)
public static int rkMatch(String text, String pattern) {char[] t = text.toCharArray();char[] p = pattern.toCharArray();int pHash = hash(p, 0, p.length);for (int i = 0; i < t.length - p.length + 1; i++) {int tHash = hash(t, i, p.length);if (tHash == pHash) {int j, k;for (j = i, k = 0; k < p.length; ) {if (t[j] == p[k]) {j++;k++;} else {break;}}if (k == p.length) {return i;}}}return -1;
}public static int hash(char[] chars, int startIndex, int length) {int r = 26;int k = 1225;int hash = 0;for (int i = startIndex; i < startIndex + length; i++) {hash = r * hash + chars[i] % k;}return hash;
}
3、KMP 匹配
// KMP 匹配
public static int kmpMatch(String text, String pattern) {char[] t = text.toCharArray();char[] p = pattern.toCharArray();int[] next = next(p);int i = 0, j = 0;while (i < t.length && j < p.length) {if (j == -1 || t[i] == p[j]) {i++;j++;} else {j = next[j];}}if (j == p.length) {return i - j;} else {return -1;}
}public static int[] next(char[] p) {int[] next = new int[p.length];int k = -1, j = 0;next[j] = -1;while (j < p.length - 1) {if (k == -1 || p[k] == p[j]) {k++;j++;if (p[k] == p[j]) {next[j] = next[k];} else {next[j] = k;}} else {k = next[k];}}return next;
}
4、BM 匹配
// BM 匹配
public static int bmMatch(String text, String pattern) {char[] t = text.toCharArray();char[] p = pattern.toCharArray();int[] ascii = ascii(p);for (int i = 0, j; i < t.length - p.length + 1; ) {for (j = p.length - 1; t[i + j] == p[j]; j--) {if (j == 0) {return i;}}i += Math.max(1, j - ascii[t[i + j]]);}return -1;
}public static int[] ascii(char[] p) {int[] ascii = new int[256];for (int i = 0; i < p.length; i++) {ascii[p[i]] = i;}return ascii;
}
5、Sunday 匹配
// Sunday 匹配
404
@XGLLHZ - 陈慧娴 -《跳舞街》.mp3