1268. 搜索推荐系统
链接:
题解:
class Solution {
public:
struct Trie {
Trie() {
end = false;
next.resize(26, nullptr);
}
bool end;
std::set<std::string> words;
std::vector<Trie*> next;
};
void insert_trie(const std::string& word) {
Trie* cur = _root;
for (auto ch : word) {
if (!cur->next[ch-'a']) {
cur->next[ch-'a'] = new (std::nothrow)Trie;;
}
cur = cur->next[ch-'a'];
cur->words.insert(word);
}
cur->end = true;
cur->words.insert(word);
}
std::vector<std::string> find_words(const std::string& prefix) {
Trie* cur = _root;
for (int i = 0; i < prefix.size(); ++i) {
if (!cur->next[prefix[i]-'a']) {
return {};
}
cur = cur->next[prefix[i]-'a'];
}
if (cur->words.size() <= 3) {
std::vector<std::string> result(cur->words.begin(), cur->words.end());
return result;
} else {
std::vector<std::string> result;
auto i = 0;
for (auto ite = cur->words.begin(); i < 3; ++i, ++ite) {
result.push_back(*ite);
}
return result;
}
return {};
}
public:
vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {
_root = new (std::nothrow)Trie;
for (auto& product : products) {
insert_trie(product);
}
std::vector<std::vector<std::string>> result;
result.reserve(searchWord.size());
for (int i = 0; i < searchWord.size(); ++i) {
result.push_back(find_words(searchWord.substr(0, i+1)));
}
return result;
}
private:
Trie* _root;
};