208.实现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
示例:
输入
["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
提示:
1 <= word.length, prefix.length <= 2000word和prefix仅由小写英文字母组成insert、search和startsWith调用次数 总计 不超过3 * 104次
方法:字典树
时间复杂度:初始化为O(1),其余操作为O(|S|),其中|S|是每次插入或查询的字符串的长度
空间复杂度:O(∣T∣⋅Σ),其中 ∣T∣为所有插入字符串的长度之和,Σ 为字符集的大小,本题 Σ=26。
1 var Trie = function () { 2 this.children = {}; 3 }; 4 5 /** 6 * @param {string} word 7 * @return {void} 8 */ 9 Trie.prototype.insert = function (word) { 10 let node = this.children; 11 for (const ch of word) { 12 if (!node[ch]) { 13 node[ch] = {}; 14 } 15 node = node[ch]; 16 } 17 node.isEnd = true; 18 }; 19 20 /** 21 * @param {string} word 22 * @return {boolean} 23 */ 24 Trie.prototype.searchPrefix = function (prefix) { 25 let node = this.children; 26 for (const ch of prefix) { 27 if (!node[ch]) { 28 return false; 29 } 30 node = node[ch]; 31 } 32 return node; 33 } 34 Trie.prototype.search = function (word) { 35 const node = this.searchPrefix(word); 36 return node !== undefined && node.isEnd !== undefined; 37 }; 38 39 /** 40 * @param {string} prefix 41 * @return {boolean} 42 */ 43 Trie.prototype.startsWith = function (prefix) { 44 return this.searchPrefix(prefix); 45 }; 46 47 /** 48 * Your Trie object will be instantiated and called as such: 49 * var obj = new Trie() 50 * obj.insert(word) 51 * var param_2 = obj.search(word) 52 * var param_3 = obj.startsWith(prefix) 53 */

浙公网安备 33010602011771号