-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
138 lines (122 loc) · 3.66 KB
/
main.cpp
File metadata and controls
138 lines (122 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Source: https://leetcode.com/problems/implement-trie-prefix-tree
// Title: Implement Trie (Prefix Tree)
// Difficulty: Medium
// Author: Mu Yang <http://muyang.pro>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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.
//
// **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` and `prefix` consist only of lowercase English letters.
// - At most `3 * 10^4` calls **in total** will be made to `insert`, `search`, and `startsWith`.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <string>
#include <vector>
using namespace std;
class Trie {
struct Node {
Node* children[26] = {};
bool isWord = false;
};
Node root;
public:
Trie() {}
void insert(const string& word) {
Node* node = &root;
for (const char ch : word) {
Node*& child = node->children[ch - 'a'];
if (!child) child = new Node();
node = child;
}
node->isWord = true;
}
bool search(const string& word) const {
const Node* node = &root;
for (const char ch : word) {
Node* const& child = node->children[ch - 'a'];
if (!child) return false;
node = child;
}
return node->isWord;
}
bool startsWith(const string& prefix) const {
const Node* node = &root;
for (const char ch : prefix) {
Node* const& child = node->children[ch - 'a'];
if (!child) return false;
node = child;
}
return true;
}
};
class Trie2 {
struct Node {
int children[26] = {};
bool isWord = false;
};
vector<Node> nodes;
int newNode() {
int id = nodes.size();
nodes.emplace_back();
return id;
}
public:
// Initialized with root with id=0
Trie2() : nodes(1) {}
void insert(const string& word) {
int id = 0;
for (char ch : word) {
ch -= 'a';
if (!nodes[id].children[ch]) nodes[id].children[ch] = newNode();
id = nodes[id].children[ch];
}
nodes[id].isWord = true;
}
bool search(const string& word) const {
int id = 0;
for (char ch : word) {
ch -= 'a';
if (!nodes[id].children[ch]) return false;
id = nodes[id].children[ch];
}
return nodes[id].isWord;
}
bool startsWith(const string& prefix) const {
int id = 0;
for (char ch : prefix) {
ch -= 'a';
if (!nodes[id].children[ch]) return false;
id = nodes[id].children[ch];
}
return true;
}
};