Boyer Moore Algorithm是从最后一位向前开始查找。
如果 text 位置上的字母 没有出现在 patter 里的话就向右shift 一个pattern的长度
如果出现的话,就看情况
这样定义每个在 text 里的字母该 shift 的情况
for (int i = 0; i < k; i++) {
table[pattern[i]] = k - i - 1;
}
1、n是原文的长度, k是查找目标的长度
2、遍历一遍数组table,把每一个值设定为 k (查找目标的长度)
3、遍历一遍 pattern 查找目标字符串,把table 相对应的位置设为 k - i - 1
4、i 是在0 和 n - k 之间存在的
public static int findBoyerMoore(char[] text, char[] pattern) {
int k = pattern.length;
int n = text.length;
int[] table = new int[255];
for (int i = 0; i < 255; i++) {
table[i] = k;
}
for (int i = 0; i < k; i++) {
table[pattern[i]] = k - i - 1;
}
int i = 0;
int skip;
while (i <= n - k) {
skip = 0;
for (int j = k - 1; j >= 0; j--) {
if (pattern[j] != text[i+j]) { // 如果对应位置的字母不相同就跳过相应的距离
skip = table[text[i+j]];
break;
}
}
i += skip;
if (skip == 0) return i; // 如果 skip 是 0 的话,就返回对应的 i
}
return -1;
}