642. Design Search Autocomplete System
来源:互联网 发布:淘宝商城童装女童鞋子 编辑:程序博客网 时间:2024/05/16 19:09
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 3 historical hot sentences that have prefix the same as the part of sentence already typed. Here are the specific rules:
- The hot degree for a sentence is defined as the number of times a user typed the exactly same sentence before.
- The returned top 3 hot sentences should be sorted by hot degree (The first is the hottest one). If several sentences have the same degree of hot, you need to use ASCII-code order (smaller one appears first).
- If less than 3 hot sentences exist, then just return as many as you can.
- When the input is a special character, it means the sentence ends, and in this case, you need to return an empty list.
Your job is to implement the following functions:
The constructor function:
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.
Now, the user wants to input a new sentence. The following function will provide the next character the user types:
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.
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:
- The input sentence will always start with a letter and end with '#', and only one blank space will exist between two words.
- The number of complete sentences that to be searched won't exceed 100. The length of each sentence including those in the historical data won't exceed 100.
- Please use double-quote instead of single-quote when you write test cases even for a character input.
- Please remember to RESET your class variables declared in class AutocompleteSystem, as static/class variables are persisted across multiple test cases. Please see herefor more details.
package l642;import java.util.ArrayList;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.TreeMap;public class AutocompleteSystem {class Node {int cnt;String content;private Node(int cnt, String content) {this.cnt = cnt;this.content = content;}}StringBuilder sb = new StringBuilder();TreeMap<Node, String> map = new TreeMap<Node, String>(new Comparator<Node>(){@Overridepublic int compare(Node o1, Node o2) {if(o1.cnt == o2.cnt)return o1.content.compareTo(o2.content);return o2.cnt - o1.cnt;}});Map<String, Node> m = new HashMap<String, Node>(); public AutocompleteSystem(String[] sentences, int[] times) { for(int i=0; i<sentences.length; i++) { Node t = new Node(times[i], sentences[i]); map.put(t, sentences[i]); m.put(sentences[i], t); } } public List<String> input(char c) { if(c == '#') { String s = sb.toString(); if(m.containsKey(s)) { Node t = m.get(s); map.remove(t); t.cnt = t.cnt + 1; map.put(t, t.content); } else { Node t = new Node(1, s); m.put(s, t); map.put(t, s); } sb = new StringBuilder(); return new ArrayList<String>(); } if(c != '#')sb.append(c); List<String> ret = new ArrayList<String>(); String prefix = sb.toString(); for(Node k : map.keySet()) { if(k.content.startsWith(prefix)) { ret.add(k.content); if(ret.size() == 3)break; } } return ret; }}
- 642. Design Search Autocomplete System
- System design
- system design
- System Design
- #Design#System Design准备
- #Design#File System Design
- Design Pattern/ OOD/ System Design
- bus search design(oracle)
- Embedded System Design
- Embedded System Design
- Design Exception System
- Scalable System Design Patterns
- Scalable System Design Patterns
- USB System Hardware Design
- System Design Diagram
- System Design Specification
- Scalable System Design Patterns
- uva11400 Lighting System Design
- 冯诺依曼结构和哈佛结构
- python 写excel(1)
- TI-BLE协议栈的GAP
- A计划 HDU
- github的简单使用教程
- 642. Design Search Autocomplete System
- java中的异常详解(1)
- Feel free to mail me: yu_tian_jian@sina.cn
- C++中二维数组作函数形参
- [Leetcode] 297. Serialize and Deserialize Binary Tree 解题报告
- HDU2444_The Accomodation of Students _染色法判二分图&邻接矩阵二分图匹配模板
- Eclipse使用问题及解决办法
- MYSQL基本命令(二)
- [leetcode]12. Integer to Roman(Java)