zoukankan      html  css  js  c++  java
  • 关于字符串截取与匹配

    看似做了一下午的无用功。

    如题:想采用树形结构对字符串进行截取并匹配名,最后发现结果无疾而终。

    需求描述:公司想对于用户在app端输入的文本进行关键字过滤,如果出现了某个敏感词汇,那么就禁止发表内容。

    比如:敏感词汇:"狗蛋",用户输入的文本内容:"某某某是狗蛋。。。。。。。。",则禁止用户发表某个内容。

    树形结构如下图所示:

    参考代码如下

    public class Match {
        /**
         * @author 
         * date 11:03 2018/7/3
         * Description 判断输入的字符串和目标的子串是否匹配
         * 用target作为敏感词去匹配输入的文本串text
         */
        public static boolean Match(String target, String text) {
            //对获取到的字符串进行截取
            //获取text字符串的长度textLength
            Integer textLength = text.length();
            //先使用最简单暴力的匹配方式进行匹配,之后再引入KMP算法进行详细的解释
            String text1 = text.substring(0, textLength / 8);
            String text2 = text.substring(textLength / 8, 2 * textLength / 8);
            String text3 = text.substring(2 * textLength / 8, 3 * textLength / 8);
            String text4 = text.substring(3 * textLength / 8, 4 * textLength / 8);
            String text5 = text.substring(4 * textLength / 8, 5 * textLength / 8);
            String text6 = text.substring(5 * textLength / 8, 6 * textLength / 8);
            String text7 = text.substring(6 * textLength / 8, 7 * textLength / 8);
            String text8 = text.substring(7 * textLength / 8);
            if (text1.contains(target) || text2.contains(target) || text3.contains(target) || text4.contains(target)
                    || text5.contains(target) || text6.contains(target) || text7.contains(target) || text8.contains(target)) {
                return false;
            }
            text1 = text1 + text2;
            text2 = text3 + text4;
            text3 = text5 + text6;
            text4 = text7 + text8;
            if (text1.contains(target) || text2.contains(target) || text3.contains(target) || text4.contains(target)) {
                return false;
            }
            text1 = text1 + text2;
            text2 = text3 + text4;
            if (text1.contains(target) || text2.contains(target)) {
                return false;
            }
            if (text.contains(target)) {
                return false;
            }
            return true;
        }
    
        public static void main(String[] args) {
            String target = "狗蛋";
            String text = "";//此处可以放入word文本内容(会上传)
            //获取当前时间
            Long startTime =System.nanoTime();
            System.out.println(Match(target, text));
            //获取当前时间
            Long endTime =System.nanoTime();
            //输出系统运行的时间
            System.out.println(endTime-startTime);
        }
    }
    

    在text的字串中放入大概万字文本内容。

    链接:文本内容

    经过测试发现,从原理上来说,如果能够匹配成功,树形结构的消耗一定会小于直接匹配的消耗。但是在这个过程中就要考虑树形结构,自身截取字符串的过程中也需要消耗时间。

    针对于静态的字符串,最大的长度是65534,现在定义的text文本的长度为一万字左右,(已满)(一个汉字对应8个字节,中间出现有数字逗号等占容量比较少的字符)

    通过比对发现,实际的实现过程中,如果注释掉树形结构的部分,那么两者消耗相抵消,甚至java自带的contains暴力匹配比树形结构的消耗更优。

    相当于做了无用功,看以后是否能够做文本匹配,是否能够更加节省时间。

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/cswxl/p/9259843.html
Copyright © 2011-2022 走看看