[LeetCode] 208. Implement Trie (Prefix Tree)
A trie (pronounced as "try") or prefix tree is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There are various applications of this data structure, such as autocomplete and spellchecker.
Implement the Trie class:
Trie()
Initializes the trie object.void insert(String word)
Inserts the stringword
into the trie.boolean search(String word)
Returnstrue
if the stringword
is in the trie (i.e., was inserted before), andfalse
otherwise.boolean startsWith(String prefix)
Returnstrue
if there is a previously inserted stringword
that has the prefixprefix
, andfalse
otherwise.
Example 1:
Input ["Trie", "insert", "search", "search", "startsWith", "insert", "search"] [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]] Output [null, null, true, false, true, null, true] Explanation Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // return True trie.search("app"); // return False trie.startsWith("app"); // return True trie.insert("app"); trie.search("app"); // return True
Constraints:
1 <= word.length, prefix.length <= 2000
word
andprefix
consist only of lowercase English letters.- At most
3 * 104
calls in total will be made toinsert
,search
, andstartsWith
.
实现 Trie (前缀树)。
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
void insert(String word) 向前缀树中插入字符串 word 。
boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/implement-trie-prefix-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题意基本跟211题一致,需要实现几个字典树的函数。思路是需要自己实现一个 TrieNode 的类然后遍历单词的每个字母。这就是模板题,需要背下来。
时间O(n), n是需要遍历的单词的长度
空间O(num of TrieNode * 26) = O(num of words * word.length() * 26)
Java实现
1 class Trie { 2 class Node { 3 Node[] children; 4 boolean isEnd; 5 String word; 6 7 public Node() { 8 children = new Node[26]; 9 isEnd = false; 10 word = ""; 11 } 12 } 13 14 Node root; 15 16 /** Initialize your data structure here. */ 17 public Trie() { 18 root = new Node(); 19 } 20 21 /** Inserts a word into the trie. */ 22 public void insert(String word) { 23 Node node = root; 24 for (int i = 0; i < word.length(); i++) { 25 int j = word.charAt(i) - 'a'; 26 if (node.children[j] == null) { 27 node.children[j] = new Node(); 28 } 29 node = node.children[j]; 30 } 31 node.isEnd = true; 32 } 33 34 /** Returns if the word is in the trie. */ 35 public boolean search(String word) { 36 Node node = root; 37 for (int i = 0; i < word.length(); i++) { 38 int j = word.charAt(i) - 'a'; 39 if (node.children[j] == null) { 40 return false; 41 } 42 node = node.children[j]; 43 } 44 return node.isEnd; 45 } 46 47 /** Returns if there is any word in the trie that starts with the given prefix. */ 48 public boolean startsWith(String prefix) { 49 Node node = root; 50 for (int i = 0; i < prefix.length(); i++) { 51 int j = prefix.charAt(i) - 'a'; 52 if (node.children[j] == null) { 53 return false; 54 } 55 node = node.children[j]; 56 } 57 return true; 58 } 59 } 60 61 /** 62 * Your Trie object will be instantiated and called as such: 63 * Trie obj = new Trie(); 64 * obj.insert(word); 65 * boolean param_2 = obj.search(word); 66 * boolean param_3 = obj.startsWith(prefix); 67 */