Design a search autocomplete system for a search engine. Users may input a sentence (at least one word and end with a special character '#'
). For each character they type except '#', you need to return the top 3historical hot sentences that have prefix the same as the part of sentence already typed. Here are the specific rules:html
Your job is to implement the following functions:git
The constructor function:github
AutocompleteSystem(String[] sentences, int[] times):
This is the constructor. The input is historical data. Sentences
is a string array consists of previously typed sentences. Times
is the corresponding times a sentence has been typed. Your system should record these historical data.app
Now, the user wants to input a new sentence. The following function will provide the next character the user types:less
List<String> input(char c):
The input c
is the next character typed by the user. The character will only be lower-case letters ('a'
to 'z'
), blank space (' '
) or a special character ('#'
). Also, the previously typed sentence should be recorded in your system. The output will be the top 3 historical hot sentences that have prefix the same as the part of sentence already typed.ide
Example:
Operation: AutocompleteSystem(["i love you", "island","ironman", "i love leetcode"], [5,3,2,2])
The system have already tracked down the following sentences and their corresponding times: "i love you"
: 5
times "island"
: 3
times "ironman"
: 2
times "i love leetcode"
: 2
times
Now, the user begins another search:
Operation: input('i')
Output: ["i love you", "island","i love leetcode"]
Explanation:
There are four sentences that have prefix "i"
. Among them, "ironman" and "i love leetcode" have same hot degree. Since ' '
has ASCII code 32 and 'r'
has ASCII code 114, "i love leetcode" should be in front of "ironman". Also we only need to output top 3 hot sentences, so "ironman" will be ignored.
Operation: input(' ')
Output: ["i love you","i love leetcode"]
Explanation:
There are only two sentences that have prefix "i "
.
Operation: input('a')
Output: []
Explanation:
There are no sentences that have prefix "i a"
.
Operation: input('#')
Output: []
Explanation:
The user finished the input, the sentence "i a"
should be saved as a historical sentence in system. And the following input will be counted as a new search. 函數
Note:post
這道題讓實現一個簡單的搜索自動補全系統,當咱們用谷歌或者百度進行搜索時,會有這樣的體驗,輸入些單詞,搜索框會彈出一些以你輸入爲開頭的一些完整的句子供你選擇,這就是一種搜索自動補全系統。根據題目的要求,補全的句子是按以前出現的頻率排列的,高頻率的出如今最上面,若是頻率相同,就按字母順序來顯示。輸入規則是每次輸入一個字符,而後返回自動補全的句子,若是遇到井字符,表示完整句子結束。那麼確定須要一個 HashMap,創建句子和其出現頻率的映射,還須要一個字符串 data,用來保存以前輸入過的字符。在構造函數中,給了一些句子,和其出現的次數,直接將其加入 HashMap,而後 data 初始化爲空字符串。在 input 函數中,首先判讀輸入字符是否爲井字符,若是是的話,那麼代表當前的 data 字符串已是一個完整的句子,在 HashMap 中次數加1,而且 data 清空,返回空集。不然的話將當前字符加入 data 字符串中,如今就要找出包含 data 前綴的前三高頻句子了,使用優先隊列來作,設計的思路是,始終用優先隊列保存頻率最高的三個句子,應該把頻率低的或者是字母順序大的放在隊首,以便隨時能夠移出隊列,因此應該是個最小堆,隊列裏放句子和其出現頻率的 pair 對兒,而且根據其頻率大小進行排序,要重寫優先隊列的 comparator。而後遍歷 HashMap 中的全部句子,首先要驗證當前 data 字符串是不是其前綴,沒啥好的方法,就逐個字符比較,用標識符 matched,初始化爲 true,若是發現不匹配,則 matched 標記爲 false,並 break 掉。而後判斷若是 matched 爲 true 的話,說明 data 字符串是前綴,那麼就把這個 pair 加入優先隊列中,若是此時隊列中的元素大於三個,那把隊首元素移除,由於是最小堆,因此頻率小的句子會被先移除。而後就是將優先隊列的元素加到結果 res 中,因爲先出隊列的是頻率小的句子,因此要加到結果 res 的末尾,參見代碼以下:this
class AutocompleteSystem { public: AutocompleteSystem(vector<string> sentences, vector<int> times) { for (int i = 0; i < sentences.size(); ++i) { freq[sentences[i]] += times[i]; } data = ""; } vector<string> input(char c) { if (c == '#') { ++freq[data]; data = ""; return {}; } data.push_back(c); auto cmp = [](pair<string, int>& a, pair<string, int>& b) { return a.second > b.second || (a.second == b.second && a.first < b.first); }; priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp) > q(cmp); for (auto f : freq) { bool matched = true; for (int i = 0; i < data.size(); ++i) { if (data[i] != f.first[i]) { matched = false; break; } } if (matched) { q.push(f); if (q.size() > 3) q.pop(); } } vector<string> res(q.size()); for (int i = q.size() - 1; i >= 0; --i) { res[i] = q.top().first; q.pop(); } return res; } private: unordered_map<string, int> freq; string data; };
Github 同步地址:url
https://github.com/grandyang/leetcode/issues/642
相似題目:
參考資料:
https://leetcode.com/problems/design-search-autocomplete-system/