美文网首页
BmOptUtils

BmOptUtils

作者: kevinfuture | 来源:发表于2021-02-24 15:24 被阅读0次
    /**
         * @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);
        }
    

    相关文章

      网友评论

          本文标题:BmOptUtils

          本文链接:https://www.haomeiwen.com/subject/giesfltx.html