如果发布内容不存在敏感词第一个字集合情况下,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));
}
}
来源:oschina
链接:https://my.oschina.net/u/113867/blog/32384