日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

LeetCode 642. 设计搜索自动补全系统(Trie树)

發(fā)布時間:2024/7/5 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 642. 设计搜索自动补全系统(Trie树) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 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’ ),空格(' ')和特殊字符('#')。輸出歷史熱度前三的具有相同前綴的句子。
樣例 : 操作 : AutocompleteSystem(["i love you", "island","ironman", "i love leetcode"], [5,3,2,2]) 系統(tǒng)記錄下所有的句子和出現(xiàn)的次數(shù): "i love you" : 5"island" : 3"ironman" : 2"i love leetcode" : 2 次 現(xiàn)在,用戶開始新的鍵入:輸入 : input('i') 輸出 : ["i love you", "island","i love leetcode"] 解釋 : 有四個句子含有前綴 "i"。其中 "ironman""i love leetcode" 有相同的熱度, 由于 ' ' 的 ASCII 碼是 32'r' 的 ASCII 碼是 114, 所以 "i love leetcode""ironman" 前面。 同時我們只輸出前三的句子,所以 "ironman" 被舍棄。輸入 : input(' ') 輸出 : ["i love you","i love leetcode"] 解釋: 只有兩個句子含有前綴 "i "。輸入 : input('a') 輸出 : [] 解釋 : 沒有句子有前綴 "i a"。輸入 : input('#') 輸出 : [] 解釋 :用戶輸入結(jié)束,"i a" 被存到系統(tǒng)中,后面的輸入被認(rèn)為是下一次搜索。

注釋 :
輸入的句子以字母開頭,以 ‘#’ 結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。