- 问题定义:快速存储和查找字符串集合的数据结构。
- 查找是否存在或有多少个。
- 过滤敏感词
- 没有标记 或者 走不通 说明不存在这个单词。
-
创建字典树:创建一个roo根节点全局使用,遍历字符串,往下生成子节点。
class TrieNode{ TrieNode next[]; //下一层 这里可以用map,敏感词过滤 int end; //判断以这个点结尾的数量 public TrieNode(TrieNode[] next, int end) { this.next = next; this.end = end; } } //------------------------------------------------------- public void insert(String word) { char[] s = word.toCharArray(); int len = s.length; TrieNode now = root; for(int i = 0;i<len;i++){ if(now.next[s[i]-'a']==null) now.next[s[i]-'a'] = new TrieNode(new TrieNode[26],0);//没有路 创建路 可以用Map创建,维护个map属性即可。 now = now.next[s[i]-'a']; } //对终点做特殊处理 now.end+=1; } public boolean search(String word) { char[] s = word.toCharArray(); int len = s.length; TrieNode now = root; for(int i = 0;i<len;i++){ if(now.next[s[i]-'a']==null) return false; now = now.next[s[i]-'a']; } //对终点做特殊判断 if(now.end==0 ) return false; return true; } public boolean startsWith(String prefix) { char[] s = prefix.toCharArray(); int len = s.length; TrieNode now = root; for(int i = 0;i<len;i++){ if(now.next[s[i]-'a']==null) return false; now = now.next[s[i]-'a']; } return true; }
题:最大异或对: 使用2进制建树,从高位到低位,for(int i = 30;i>=0;i–)