BmOptUtils

/**
     * @param pattern 模式串:要匹配的短语
     * @param input 被匹配的短语输入
     * **/
    private static boolean indexOf(String pattern, String input){
        try{
            int n = pattern.length();
            int m = input.length();
            if(m <= 0 || n <= 0){
                return false;
            }
            if(m < n){
                return false;
            }

            //设置起始位置。起始位置为:0~pattern.length - 1
            int i = n - 1;
            int j = n - 1;
            while (i < m && j >= 0){
                System.out.println(input.charAt(i) + " --- " + pattern.charAt(j));
                if(input.charAt(i) != pattern.charAt(j)){
                    int bad = getBadCharLen(input.charAt(i), pattern.toCharArray(), j);
                    //通过当前循环中的索引获取好后缀的长度
                    int goodSuffix = n - 1 - j + bad;
                    int len = Math.max(bad, goodSuffix);
                    if(goodSuffix > bad){
                        i = i + len + n;
                    }else {
                        i += len;
                    }
                    j = n - 1;
                }else{
                    --i;
                    --j;
                }

            }
            if(i >= m){
                return false;
            }
            return true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 如果是坏字符,则需要移动的长度
     * 通过判断是否存在好字符位置
     * **/
    private static int getBadCharLen(char inputChar, char[] patternChars, int i){
        try{
            int m = i;
            for(; m >= 0; --m){
                if(inputChar == patternChars[m]){
                    //验证是否坏串中存在字符相同的,存在则表示移动到对应该位置; 如果"坏字符"不包含在搜索词之中,则上一次出现位置为 -1。
                    return i - m == 0 ? 1 : i - m;
                }
            }
            //否则表示整个串是坏串,根据公式坏字符位置 - (-1) = len
            return i;
        }catch (Exception e){
            e.printStackTrace();
        }
        return 0;
    }

    public static void main(String[] args) {
        List<PatternLocation> matchs = indexOf("成海贼王", "我是要成为海贼王的男人还好大");
        System.out.println(matchs);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 夜莺2517阅读 127,784评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 11,829评论 1 6
  • 我是一名过去式的高三狗,很可悲,在这三年里我没有恋爱,看着同龄的小伙伴们一对儿一对儿的,我的心不好受。怎么说呢,高...
    小娘纸阅读 8,683评论 4 7
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,718评论 28 53