【LeetCode 208】Implement Trie (Prefix Tree)

Implement a trie with insertsearch, and startsWith methods.

Note:
You may assume that all inputs are consist of lowercase letters a-z.

思路:

构建一个简单的字典树,要求实现插入、查找、查找前缀三个操作。这里使用map实现对子树的构建(一方面方便查找,另一方面是懒 - -!),但是效率并不是太高,LeetCode上提交后跑了147ms,不是很理想,不过不影响对字典树这种树形结构的理解。

 1 class TrieNode {
 2 public:
 3     // Initialize your data structure here.
 4     TrieNode(char c):ch(c), isEnd(false){}
 5
 6     map<char, TrieNode *> childNode;
 7
 8     char ch;
 9     bool isEnd;
10 };
11
12 class Trie {
13 public:
14     Trie() {
15         root = new TrieNode(‘#‘);
16     }
17
18     // Inserts a word into the trie.
19     void insert(string s) {
20
21         TrieNode *t = root;
22
23         //从root遍历待插入字符串,若c存在则继续向下遍历,反之则新建一个分支
24         for(int i = 0; i < s.length(); i++)
25         {
26             char c = s[i];
27
28             map<char, TrieNode*>::iterator it = t->childNode.find(c);
29             if(it == t->childNode.end())
30             {
31                 TrieNode *newNode = new TrieNode(c);
32                 t->childNode.insert(make_pair(c, newNode));
33                 t = newNode;
34             }
35             else
36             {
37                 t = t->childNode[c];
38             }
39         }
40         t->isEnd = true;
41     }
42
43     // Returns if the word is in the trie.
44     bool search(string key) {
45         TrieNode *s = root;
46
47         //从root遍历待查找字符串,若c存在则向下遍历,反之则不存在
48         for(int i = 0; i < key.length(); i++)
49         {
50             char c = key[i];
51
52             map<char, TrieNode*>::iterator it = s->childNode.find(c);
53             if(it == s->childNode.end())
54                 return false;
55             else
56                 s = s->childNode[c];
57         }
58         //返回最后一个结点的状态,判断是否为一个word
59         return s->isEnd;
60     }
61
62     // Returns if there is any word in the trie
63     // that starts with the given prefix.
64     bool startsWith(string prefix) {
65         TrieNode *s = root;
66
67         //与search一致
68         for(int i = 0; i < prefix.length(); i++)
69         {
70             char c = prefix[i];
71
72             map<char, TrieNode*>::iterator it = s->childNode.find(c);
73
74             if(it == s->childNode.end())
75                 return false;
76             else
77                 s = s->childNode[c];
78         }
79         //只要找到即返回true
80         return true;
81     }
82
83 private:
84     TrieNode* root;
85 };
时间: 2024-10-16 12:15:24

【LeetCode 208】Implement Trie (Prefix Tree)的相关文章

LeetCode OJ:Implement Trie (Prefix Tree)(实现一个字典树(前缀树))

Implement a trie with insert, search, and startsWith methods. 实现字典树,前面好像有道题做过类似的东西,代码如下: 1 class TrieNode { 2 public: 3 // Initialize your data structure here. 4 TrieNode():isLeaf(false) 5 { 6 for(auto & t : dic){ 7 t = NULL; 8 } 9 } 10 TrieNode * di

leetcode Implement Trie (Prefix Tree)

题目连接 https://leetcode.com/problems/implement-trie-prefix-tree/ Implement Trie (Prefix Tree) Description Implement a trie with insert, search, and startsWith methods. 字典树.. class TrieNode { public: // Initialize your data structure here. bool vis; Tri

[LeetCode]Implement Trie(Prefix Tree),解题报告

目录 目录 概述 Trie树基本实现 定义Trie树节点 添加操作 查询word是否在Trie树中 AC完整代码 概述 Trie树,又称为字典树.单词查找树或者前缀树,是一种用于快速检索的多叉数结构.例如,英文字母的字典树是26叉数,数字的字典树是10叉树. Trie树的基本性质有三点,归纳为: 根节点不包含字符,根节点外每一个节点都只包含一个字符. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串. 每个节点的所有子节点包含的字符串不相同. Trie树基本实现 我们通过Lee

[LeetCode][JavaScript]Implement Trie (Prefix Tree)

Implement Trie (Prefix Tree) Implement a trie with insert, search, and startsWith methods. https://leetcode.com/problems/implement-trie-prefix-tree/ 实现字典树,每个节点至多有26个子孙,代表26个字母. 每个节点都有三个属性,key, isWord以及字典(哈希表,提高访问速度,也可以用数组),因为JS可以扩展实例化的对象,直接用下标访问对象,不需

LeetCode 208. Implement Trie (Prefix Tree)

Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs are consist of lowercase letters a-z. 这道题让我们实现一个重要但又有些复杂的数据结构-字典树, 又称前缀树或单词查找树,详细介绍可以参见网友董的博客,例如,一个保存了8个键的trie结构,"A", "to", "tea&quo

Implement Trie (Prefix Tree) 解答

Question Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs are consist of lowercase letters a-z. Solution A trie node should contains the character, its children and the flag that marks if it is a leaf

[LeetCode] 208. Implement Trie (Prefix Tree) Java

题目: Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs are consist of lowercase letters a-z. 题意及分析:实现一个字典树或者叫前缀树的插入.删除和startsWith判断.这里定义一个trieNode类作为字典树的节点类.然后有一个chilrden数组保存子节点,一个isWord变量来判断从根节点到该节点是否是一

Java for LeetCode 208 Implement Trie (Prefix Tree)

Implement a trie with insert, search, and startsWith methods. Note: You may assume that all inputs are consist of lowercase letters a-z. 解题思路: 参考百度百科:Trie树 已经给出了详细的代码: JAVA实现如下: class TrieNode { // Initialize your data structure here. int num;// 有多少单

[leetcode trie]208. Implement Trie (Prefix Tree)

实现一个字典树 1 class Trie(object): 2 3 def __init__(self): 4 self.root = TrieNode() 5 6 def insert(self, word): 7 cur = self.root 8 for i in word: 9 cur = cur.children[i] 10 cur.is_word = True 11 12 13 def search(self, word): 14 cur = self.root 15 for i i