Leetcode 208.实现前缀树

实现前缀树

实现一个 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 }
原文地址:https://www.cnblogs.com/kexinxin/p/10203025.html