实现前缀树
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
示例:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // 返回 true
trie.search("app"); // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");
trie.search("app"); // 返回 true
说明:
- 你可以假设所有的输入都是由小写字母 a-z 构成的。
- 保证所有输入均为非空字符串。
1 dclass TrieNode{ 2 char c; 3 boolean leaf; 4 HashMap<Character,TrieNode> children=new HashMap<Character,TrieNode>(); 5 public TrieNode(char c){ 6 this.c=c; 7 } 8 public TrieNode(){}; 9 } 10 11 public class Trie{ 12 private TrieNode root; 13 public Trie(){ 14 root=new TrieNode(); 15 } 16 17 public void insert(String word){ 18 Map<Character,TrieNode> children=root.children; 19 for(int i=0;i<word.length();i++){ 20 char c=word.charAt(i); 21 TrieNode t; 22 if(children.containsKey(c)){ 23 t=children.get(c); 24 }else{ 25 t=new TrieNode(c); 26 children.put(c,t); 27 } 28 children=t.children; 29 if(i==word.length()-1) 30 t.leaf=true; 31 } 32 } 33 34 public boolean search(String word){ 35 TrieNode t=searchNode(word); 36 return t!=null && t.leaf; 37 } 38 39 private TrieNode searchNode(String word){ 40 Map<Character,TrieNode> children=root.children; 41 TrieNode t=null; 42 for(int i=0;i<word.length();i++){ 43 char c=word.charAt(i); 44 if(!children.containsKey(c)) return null; 45 t=children.get(c); 46 children=t.children; 47 } 48 return t; 49 } 50 51 public boolean startsWith(String prefix){ 52 return searchNode(prefix)!=null; 53 } 54 }