Skip to content

Commit 0ef05c2

Browse files
authored
Create implement-trie-ii-prefix-tree.cpp
1 parent cb9f3b0 commit 0ef05c2

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

C++/implement-trie-ii-prefix-tree.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// Time: ctor: O(1)
2+
// insert: O(n)
3+
// count_word: O(n)
4+
// count_prefix: O(n)
5+
// erase: O(n)
6+
// Space: O(t), t is the number of nodes in trie
7+
8+
class TrieNode {
9+
public:
10+
TrieNode() : children(26) {}
11+
vector<unique_ptr<TrieNode>> children;
12+
int pcnt = 0;
13+
int cnt = 0;
14+
};
15+
16+
class Trie {
17+
public:
18+
Trie() {
19+
trie_ = make_unique<TrieNode>();
20+
}
21+
22+
void insert(string word) {
23+
auto curr = trie_.get();
24+
++curr->pcnt;
25+
for (const auto& c : word) {
26+
if (curr->children[c - 'a'] == nullptr) {
27+
curr->children[c - 'a'] = make_unique<TrieNode>();
28+
}
29+
curr = curr->children[c - 'a'].get();
30+
++curr->pcnt;
31+
}
32+
++curr->cnt;
33+
}
34+
35+
int countWordsEqualTo(string word) {
36+
auto curr = trie_.get();
37+
for (const auto& c : word) {
38+
if (curr->children[c - 'a'] == nullptr) {
39+
return 0;
40+
}
41+
curr = curr->children[c - 'a'].get();
42+
}
43+
return curr->cnt;
44+
}
45+
46+
int countWordsStartingWith(string prefix) {
47+
auto curr = trie_.get();
48+
for (const auto& c : prefix) {
49+
if (curr->children[c - 'a'] == nullptr) {
50+
return 0;
51+
}
52+
curr = curr->children[c - 'a'].get();
53+
}
54+
return curr->pcnt;
55+
}
56+
57+
void erase(string word) {
58+
int cnt = countWordsEqualTo(word);
59+
if (!cnt) {
60+
return;
61+
}
62+
auto curr = trie_.get();
63+
--curr->pcnt;
64+
for (const auto& c : word) {
65+
if (curr->children[c - 'a']->pcnt == 1) {
66+
curr->children[c - 'a'].reset(); // delete all unused nodes
67+
return;
68+
}
69+
curr = curr->children[c - 'a'].get();
70+
--curr->pcnt;
71+
}
72+
--curr->cnt;
73+
}
74+
75+
private:
76+
unique_ptr<TrieNode> trie_;
77+
};

0 commit comments

Comments
 (0)