编程珠玑 - 算法优化 - 过滤敏感词 - 第三步:树形结构

来源:互联网 发布:如何做好企业网络推广 编辑:程序博客网 时间:2024/05/21 12:46

如果发布内容不存在敏感词第一个字集合情况下,test2做出了很大优化,循环次数为发布内容个数。

但是如果发布内容村子敏感词,还是使用了test1方法,问题还存在。

怎样脱离test1方法?我们可以考虑把敏感词进一步分析,第二个字集合也进行规整、第三个字集合、第四个...。

这个让我想到了树形结构:

    办     气        裸        土

    证     枪      聊  表     枪

            出             演    卖

            售

每一层进行规整,但是不同的层可能出现相同的字,怎么区分他们?

我们进行从根到层的一个map拓展,这样可以区分不同的分支。

简单说,就是第二层有两个“枪”,但是第一个属于“气”父亲,第二个属于“土”父亲,我们根据“气枪”找到它下面的集合“出”,根据“土枪”找到集合“卖”。

package test;import static util.PrintUtil.print;import java.util.ArrayList;import java.util.HashMap;public class Test {static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"};static String tContent = "再办证顶";static ArrayList<String> first = new ArrayList<String>();static HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();static {ArrayList<String> temp;String key, value;int length;for (String k : keys) {if (!first.contains(k.substring(0, 1))) {first.add(k.substring(0, 1));}length = k.length();for (int i = 1; i < length; i ++) {key = k.substring(0, i);value = k.substring(i, i + 1);if (i == 1 && !first.contains(key)) {first.add(key);}// 有,添加if (map.containsKey(key)) {if (!map.get(key).contains(value)) {map.get(key).add(value);}}// 没有添加else {temp = new ArrayList<String>();temp.add(value);map.put(key, temp);}}}}/** * 快速实现的方法 */public final static String test1(String content) {for (String k : keys) {if (content.indexOf(k) > -1)return k;}return null;}/** * 优化一 */public final static String test2(String content) {boolean bFirst = false;int length = content.length();for (int i = 0; i < length; i ++) {if (first.contains(content.substring(i, i + 1))) {bFirst = true;break;}}return bFirst ? test1(content) : null;}/** * 优化二 */public final static String test3(String content) {String r = null, f, g, c = content;ArrayList<String> temps;int length = c.length();tag : for (int i = 0; i < length - 1; i++) {f = c.substring(i, i + 1);if (first.contains(f)) {for (int j = i + 1; j < length; j++) {f = c.substring(i, j);g = c.substring(j, j + 1);temps = map.get(f);if (temps == null) { // 找到了print("ok");r = f;break tag;}if (temps.contains(g)) {if (j == length - 1) {print("find!");r = c.substring(i, j + 1);break tag;}} else { // 没有找到了break;}}}}return r;}public static void main(String[] args) {long time1 = System.currentTimeMillis();print(test3(tContent));print("test3 time:" + (System.currentTimeMillis() - time1));}}


原创粉丝点击