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 matchs = indexOf("成海贼王", "我是要成为海贼王的男人还好大");
        System.out.println(matchs);
    }

你可能感兴趣的:(BmOptUtils)