1268. 搜索推荐系统

 

链接:

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;
};