-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsuggestedProducts.cpp
More file actions
42 lines (41 loc) · 1.25 KB
/
suggestedProducts.cpp
File metadata and controls
42 lines (41 loc) · 1.25 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
class Trienode {
public:
Trienode() {}
std::shared_ptr<Trienode> data[26];
vector<int> p;
};
class Solution {
public:
vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {
sort(products.begin(), products.end());
auto root = std::make_shared<Trienode>(), node = root;
for (int i = 0; i < products.size(); ++i) {
node = root;
for (char c: products[i]) {
if (!node -> data[c - 'a']) {
node -> data[c - 'a'] = make_shared<Trienode>();
}
node = node -> data[c - 'a'];
if ((node -> p).size() < 3)
(node -> p).push_back(i);
}
}
vector<vector<string>> ans;
node = root;
bool flag = false;
for (char c: searchWord) {
if (flag || !node -> data[c - 'a']) {
ans.emplace_back();
flag = true;
}
else {
vector<string> v;
node = node -> data[c - 'a'];
for (int idx: node -> p)
v.push_back(products[idx]);
ans.push_back(std::move(v));
}
}
return ans;
}
};