208. Implement Trie (Prefix Tree)(实现 Trie (前缀树))
题目大意
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 string word into the trie.boolean search(String word)
Returns true if the string word is in the trie (i.e., was inserted before), and false otherwise.boolean startsWith(String prefix)
Returns true if there is a previously inserted string word that has the prefix prefix, and false otherwise.
中文释义
Trie(发音为 “try”)或前缀树是一种树形数据结构,用于有效地存储和检索字符串数据集中的键。这种数据结构有各种应用,如自动完成和拼写检查。
实现 Trie 类:
Trie()
初始化 trie 对象。void insert(String word)
将字符串 word 插入到 trie 中。boolean search(String word)
如果字符串 word 在 trie 中(即之前已插入),返回 true,否则返回 false。boolean startsWith(String prefix)
如果之前插入的字符串 word 有前缀 prefix,返回 true,否则返回 false。
示例
- 示例 1:
- 输入:[“Trie”, “insert”, “search”, “search”, “startsWith”, “insert”, “search”]
- 输入:[[], [“apple”], [“apple”], [“app”], [“app”], [“app”], [“app”]]
- 输出:[null, null, true, false, true, null, true]
- 解释:
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
- 输入:[“Trie”, “insert”, “search”, “search”, “startsWith”, “insert”, “search”]
限制条件
1 <= word.length, prefix.length <= 2000
word
和prefix
仅由小写英文字母组成。- 最多将对 insert、search 和 startsWith 方法进行 3 * 10^4 次调用。
实现
实现 Trie 类,包括 TrieNode 子类和 Trie 方法。
TrieNode 类
- 表示 Trie 中的一个节点。
- 包含一个布尔值
isEnd
,指示该节点是否是一个单词的结尾。 - 包含一个 TrieNode 类型的数组
children
,表示子节点。
Trie 类
- 包含一个 TrieNode 类型的根节点
root
。 insert
方法,用于插入一个单词。search
方法,用于搜索一个单词。startsWith
方法,用于检查是否存在具有特定前缀的单词。
代码
class TrieNode {
public:
bool isEnd;
TrieNode* children[26];
TrieNode() {
isEnd = false;
for (int i = 0; i < 26; i++) {children[i] = nullptr;}
}
};
class Trie {
public:
TrieNode* root;
Trie() {
root = new TrieNode();
}
void insert(string word) {
TrieNode* node = root;
for (char c: word) {
if (node -> children[c - 'a'] == nullptr) {
node -> children[c - 'a'] = new TrieNode();
}
node = node -> children[c - 'a'];
}
node -> isEnd = true;
}
bool search(string word) {
TrieNode* node = root;
for (char c: word) {
node = node -> children[c - 'a'];
if (node == nullptr) return false;
}
return node -> isEnd;
}
bool startsWith(string prefix) {
TrieNode* node = root;
for (char c: prefix) {
node = node -> children[c - 'a'];
if (node == nullptr) return false;
}
return true;
}
};