編程珠璣 - 算法優化 - 過濾敏感詞 - 第三步:樹形結構

若是發佈內容不存在敏感詞第一個字集合狀況下,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));
	}
}
相關文章
相關標籤/搜索