/
1268. Search Suggestions System 4.cpp
106 lines (86 loc) · 2.15 KB
/
1268. Search Suggestions System 4.cpp
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
// https://leetcode.com/problems/search-suggestions-system/
class TrieNode
{
public:
char val;
TrieNode *children[26];
bool isWord;
TrieNode()
{
memset(children, 0, sizeof(children));
this->isWord = false;
}
TrieNode(char val)
{
this->val = val;
memset(children, 0, sizeof(children));
this->isWord = false;
}
};
class Trie
{
public:
TrieNode *root;
Trie()
{
root = new TrieNode();
}
void insert(string word)
{
TrieNode *current = root;
for (int i = 0; i < word.size(); ++i)
{
if (!current->children[word[i] - 'a'])
current->children[word[i] - 'a'] = new TrieNode(word[i]);
current = current->children[word[i] - 'a'];
}
current->isWord = true;
}
vector<string> search(string prefix)
{
vector<string> words;
TrieNode *current = root;
for (int i = 0; i < prefix.size(); ++i)
{
if (current->children[prefix[i] - 'a'] == nullptr)
return {};
current = current->children[prefix[i] - 'a'];
}
dfs(current, words, prefix);
return words;
}
void dfs(TrieNode *root, vector<string> &words, string ¤tWord)
{
if (words.size() == 3)
return;
if (root->isWord == true)
words.push_back(currentWord);
for (int i = 0; i < 26; ++i)
{
if (root->children[i] != nullptr)
{
currentWord += (i + 'a');
dfs(root->children[i], words, currentWord);
currentWord.pop_back();
}
}
}
};
class Solution
{
public:
vector<vector<string>> suggestedProducts(vector<string> &products, string searchWord)
{
vector<vector<string>> result;
Trie *trie = new Trie();
string prefix = "";
for (string &product : products)
trie->insert(product);
for (char &c : searchWord)
{
prefix += c;
result.push_back(trie->search(prefix));
}
return result;
}
};