若是發佈內容不存在敏感詞第一個字集合狀況下,test2作出了很大優化,循環次數爲發佈內容個數。java
可是若是發佈內容村子敏感詞,仍是使用了test1方法,問題還存在。優化
怎樣脫離test1方法?咱們能夠考慮把敏感詞進一步分析,第二個字集合也進行規整、第三個字集合、第四個...。code
這個讓我想到了樹形結構:get
辦 氣 裸 土string
證 槍 聊 表 槍class
出 演 賣test
售import
每一層進行規整,可是不一樣的層可能出現相同的字,怎麼區分他們?List
咱們進行從根到層的一個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)); } }