public class BoyerMooreDemo {
public static void main(String[] args) {
// String str = "1234567890";
// String regex = "456";
String str = "aacdccde";
String regex = "ccd";
int indexOf = indexOfBadCharacterRule(str.toCharArray(), regex.toCharArray());
System.out.println(indexOf);
}
/**
* 单独实现
* 坏字符规则
*
* @param str 主串
* @param regex 模式串
* @author 18118224_周亿进
* @since 16:36 2020/4/1
*/
static int indexOfBadCharacterRule(char[] str, char[] regex) {
int n = str.length;//主串的长度设为n
int m = regex.length;//模式串的长度设为m
OUTER:
for (int i = 0; i < n; ) { //i不在这控制
INNER:
for (int j = (m - 1); j >= 0; j--) {//模式串从后往前匹配
char regexChar = regex[j];
char strChar = str[i + j];
if (regexChar == strChar) {
if (j == 0) {
//模式串已经全部匹配上了,则直接返回下标
return i;
} else {
//如果匹配上了,则逐个字符匹配,直到匹配上
continue INNER;
}
} else { //如果没有匹配上
//j 是坏字符 在模式串中的下标
//现在找一下这个坏字符在模式串的坏字符前面有没有出现
//比如主串是 accdefg
//模式串是 ccd
//现在坏字符对于 主串是c,对于模式串是d
//我们要在模式串d往前找c有没有出现,而且要找模式串中最后出现的c,
int existsIndex = -1;
for (int k = (j - 1); k >= 0; k--) {//todo 这里遍历可以想办法换成hash的方式
if (regex[k] == strChar) {
existsIndex = k;//记录下这个坏字符在模式串中出现的位置
break; //找到了,直接结束循环
}
}
if (existsIndex > -1) { //如果模式串中有此坏字符,则要把,模式串中有这个字符的位置和主串中坏字符的位置对准
i = i + (m - 1 - existsIndex); //这里有点像好后缀思想
} else {//如果没在模式串中找到此坏字符,则需要把模式串往后匹配
i = i + j + 1;
}
continue OUTER;
}
}
}
return -1;
}
}
BoyerMoore字符串算法(坏字符实现)
最新推荐文章于 2021-04-07 21:39:01 发布