Implement Trie (Prefix Tree)
2015-08-17 20:33
447 查看
Implement a trie with insert, search, and startsWith methods.
trie树,又叫字典树,单词查找树。
它有三个特性:根节点不包含字符,除根节点外每一个节点都只包含一个字符;
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
每个节点的所有子节点包含的字符都不相同。
一个trie node应该包括它的character,它的children和是否是叶结点。
所以先定义TrieNode:
然后是Trie类,可以实现插入,查找单词(isLeaf=true),查找前缀的操作。
trie树,又叫字典树,单词查找树。
它有三个特性:根节点不包含字符,除根节点外每一个节点都只包含一个字符;
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
每个节点的所有子节点包含的字符都不相同。
一个trie node应该包括它的character,它的children和是否是叶结点。
所以先定义TrieNode:
class TrieNode { // Initialize your data structure here. char c; HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>(); boolean isLeaf; public TrieNode(char c){ this.c = c; } public TrieNode() { } }
然后是Trie类,可以实现插入,查找单词(isLeaf=true),查找前缀的操作。
public class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } // Inserts a word into the trie. public void insert(String word) { HashMap<Character,TrieNode> children=root.children; for(int i=0;i<word.length();i++){ char c=word.charAt(i); TrieNode t; if(children.containsKey(c)){ t=children.get(c); }else{ t=new TrieNode(c); children.put(c,t); } children=t.children; if(i==word.length()-1) t.isLeaf=true; } } // Returns if the word is in the trie. public boolean search(String word) { TrieNode t=findNode(word); if(t!=null&&t.isLeaf) return true; else return false; } // Returns if there is any word in the trie // that starts with the given prefix. public boolean startsWith(String prefix) { if(findNode(prefix)==null) return false; else return true; } private TrieNode findNode(String s){ HashMap<Character,TrieNode> children=root.children; TrieNode t=null; for(int i=0;i<s.length();i++){ char c=s.charAt(i); if(children.containsKey(c)){ t=children.get(c); children=t.children; }else return null; } return t; } } // Your Trie object will be instantiated and called as such: // Trie trie = new Trie(); // trie.insert("somestring"); // trie.search("key");
相关文章推荐
- 黑马程序员——Collections和Arrays工具类
- 动态规划-0-1背包问题
- 快速打开 Mac OS X 隐藏的用户资源库文件夹
- 正确openvSwitch不同种类port认识
- HDU 1848 Fibonacci again and again(SG函数)
- DataTable 转化为List
- BestCoder Round #50 (div.2)
- HDOJ Matrix multiplication 4920【矩阵相乘】
- Complete uninstall on Mac, HELP!
- 2015.7.30 第五堂(补)delegate 三部曲理解之三(使用delegate)
- solaris 软件包地址
- 流动python - 写port扫描仪和各种并发尝试(多线程/多进程/gevent/futures)
- 一致性哈希算法学习及JAVA代码实现分析
- 关于mini2440按键中断的配置
- Android之——退出多个Activity
- 关于xcode 断点的设置
- [效率提升]工作中的那些命令行
- java中split以"."分割
- [cf193c]Students' Revenge解题报告
- LeetCode-Single NumberI II III