LeetCode 1268. 搜索推荐系统(Trie树/multiset)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1268. 搜索推荐系统(Trie树/multiset)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 題目
給你一個產(chǎn)品數(shù)組 products 和一個字符串 searchWord ,products 數(shù)組中每個產(chǎn)品都是一個字符串。
請你設(shè)計一個推薦系統(tǒng),在依次輸入單詞 searchWord 的每一個字母后,推薦 products 數(shù)組中前綴與 searchWord 相同的最多三個產(chǎn)品。
如果前綴相同的可推薦產(chǎn)品超過三個,請按字典序返回最小的三個。
請你以二維列表的形式,返回在輸入 searchWord 每個字母后相應(yīng)的推薦產(chǎn)品的列表。
示例 1: 輸入:products = ["mobile","mouse","moneypot","monitor","mousepad"], searchWord = "mouse" 輸出:[ ["mobile","moneypot","monitor"], ["mobile","moneypot","monitor"], ["mouse","mousepad"], ["mouse","mousepad"], ["mouse","mousepad"] ] 解釋:按字典序排序后的產(chǎn)品列表是 ["mobile","moneypot","monitor","mouse","mousepad"] 輸入 m 和 mo,由于所有產(chǎn)品的前綴都相同,所以系統(tǒng)返回字典序最小的三個產(chǎn)品["mobile","moneypot","monitor"] 輸入 mou, mous 和 mouse 后系統(tǒng)都返回 ["mouse","mousepad"]示例 2: 輸入:products = ["havana"], searchWord = "havana" 輸出:[["havana"],["havana"],["havana"],["havana"],["havana"],["havana"]]示例 3: 輸入:products = ["bags","baggage","banner","box","cloths"], searchWord = "bags" 輸出:[["baggage","bags","banner"],["baggage","bags","banner"],["baggage","bags"],["bags"]]示例 4: 輸入:products = ["havana"], searchWord = "tatiana" 輸出:[[],[],[],[],[],[],[]]提示: 1 <= products.length <= 1000 1 <= Σ products[i].length <= 2 * 10^4 products[i] 中所有的字符都是小寫英文字母。 1 <= searchWord.length <= 1000 searchWord 中所有字符都是小寫英文字母。來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/search-suggestions-system
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
2.1 Trie樹
參考:Trie樹
class trie { public:trie* next[26] = {NULL};bool isend = false;int count = 0;void insert(string& s){trie* cur = this;for(int i = 0; i < s.size(); i++){if(cur->next[s[i]-'a'] == NULL)cur->next[s[i]-'a'] = new trie();cur = cur->next[s[i]-'a'];}cur->count++;cur->isend = true;} }; class Solution { public:vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {trie* t = new trie();for(string& p : products)t->insert(p);//單詞插入trie樹vector<vector<string>> ans(searchWord.size());int i = 0, idx = 0, j = 0, n = searchWord.size();string prefix = "";trie* cur = t;for(i = 0; i < n; ++i){prefix += searchWord[i];for( ; j < prefix.size(); ++j){if(cur->next[prefix[j]-'a'] == NULL)return ans;cur = cur->next[prefix[j]-'a'];}//找到前綴dfs(cur,prefix,ans[i]);}return ans;}void dfs(trie* cur, string& str, vector<string>& list){ //遍歷前綴以下的節(jié)點,找到單詞if(list.size() == 3)return;if(!cur) return;if(cur->isend){int n = cur->count;while(list.size() < 3 && n--)list.push_back(str);}for(int i = 0; i < 26; ++i){str += i+'a';dfs(cur->next[i],str,list);str.pop_back();}} };1140 ms 68.4 MB
2.2 multiset
class Solution { public:vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {multiset<string> s;for(string& p : products)s.insert(p);//插入multisetvector<vector<string>> ans(searchWord.size());string prefix = "";for(int i = 0; i < searchWord.size(); ++i){prefix += searchWord[i];//輸入單詞前綴auto start = s.lower_bound(prefix);//二分查找下界for(auto it = start; it != s.end() && ans[i].size() < 3; ++it){ //把后序3個包含前綴的單詞加入答案if((*it).find(prefix) == 0)ans[i].push_back(*it);elsebreak;}}return ans;} };80 ms 24.4 MB
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1268. 搜索推荐系统(Trie树/multiset)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1099. 小于 K
- 下一篇: LeetCode 1134. 阿姆斯特朗