LeetCode 642. 设计搜索自动补全系统(Trie树)
文章目錄
- 1. 題目
- 2. 解題
1. 題目
為搜索引擎設(shè)計一個搜索自動補(bǔ)全系統(tǒng)。
用戶會輸入一條語句(最少包含一個字母,以特殊字符 ‘#’ 結(jié)尾)。
除 ‘#’ 以外用戶輸入的每個字符,返回歷史中熱度前三并以當(dāng)前輸入部分為前綴的句子。下面是詳細(xì)規(guī)則:
- 一條句子的熱度定義為歷史上用戶輸入這個句子的總次數(shù)。
- 返回前三的句子需要按照熱度從高到低排序(第一個是最熱門的)。如果有多條熱度相同的句子,請按照 ASCII 碼的順序輸出(ASCII 碼越小排名越前)。
- 如果滿足條件的句子個數(shù)少于 3,將它們?nèi)枯敵觥?/li>
- 如果輸入了特殊字符,意味著句子結(jié)束了,請返回一個空集合。
你的工作是實(shí)現(xiàn)以下功能:
構(gòu)造函數(shù):
- AutocompleteSystem(String[] sentences, int[] times): 這是構(gòu)造函數(shù),輸入的是歷史數(shù)據(jù)。
Sentences 是之前輸入過的所有句子,Times 是每條句子輸入的次數(shù),你的系統(tǒng)需要記錄這些歷史信息。
現(xiàn)在,用戶輸入一條新的句子,下面的函數(shù)會提供用戶輸入的下一個字符:
- List<String> input(char c): 其中 c 是用戶輸入的下一個字符。
字符只會是小寫英文字母(‘a(chǎn)’ 到 ‘z’ ),空格(' ')和特殊字符('#')。輸出歷史熱度前三的具有相同前綴的句子。
注釋 :
輸入的句子以字母開頭,以 ‘#’ 結(jié)尾,兩個字母之間最多只會出現(xiàn)一個空格。
即將搜索的句子總數(shù)不會超過 100。
每條句子的長度(包括已經(jīng)搜索的和即將搜索的)也不會超過 100。
即使只有一個字母,輸出的時候請使用雙引號而不是單引號。
請記住清零 AutocompleteSystem 類中的變量,因為靜態(tài)變量、類變量會在多組測試數(shù)據(jù)中保存之前結(jié)果。詳情請看這里。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/design-search-autocomplete-system
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
class trie { public:unordered_map<char, trie*> next;string word;//記錄單詞int freq = 0;//是單詞時,記錄頻數(shù)void insert(string& s, int time){trie *cur = this;for(int i = 0; i < s.size(); ++i){if(!cur->next.count(s[i]))cur->next[s[i]] = new trie();cur = cur->next[s[i]];}cur->word = s;cur->freq += time;}void find(trie* cur, vector<pair<int, string>> &freq_wd){if(!cur) return;if(cur->freq)//找到單詞,存入候選集合freq_wd.push_back({cur->freq, cur->word});for(auto item : cur->next)find(item.second, freq_wd);} }; class AutocompleteSystem {trie* t, *cur;string prefix; public:AutocompleteSystem(vector<string>& sentences, vector<int>& times) {t = new trie();cur = t;for(int i = 0; i < sentences.size(); ++i)t->insert(sentences[i], times[i]);}vector<string> input(char c) {if(c == '#'){t->insert(prefix, 1);//單詞記錄+1次prefix = "";cur = t;return {};}else{prefix += c;if(!cur->next.count(c))cur->next[c] = new trie();cur = cur->next[c];vector<pair<int, string>> freq_wd;t->find(cur, freq_wd);sort(freq_wd.begin(), freq_wd.end(),[&](auto a, auto b){if(a.first == b.first)return a.second < b.second;return a.first > b.first;});//排序,取前3vector<string> ans;for(int i = 0; i < min(3, int(freq_wd.size())); ++i)ans.push_back(freq_wd[i].second);return ans;}} };1040 ms 238.7 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關(guān)注我的公眾號(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 642. 设计搜索自动补全系统(Trie树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker安装+镜像拉取+容器+创建镜
- 下一篇: java信息管理系统总结_java实现科