BoyerMoore字符串算法(坏字符实现)

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值