输入
["AutocompleteSystem", "input", "input", "input", "input"]
[[["i love you", "island", "iroman", "i love leetcode"], [5, 3, 2, 2]], ["i"], [" "], ["a"], ["#"]]
输出
[null, ["i love you", "island", "i love leetcode"], ["i love you", "i love leetcode"], [], []]
解释
AutocompleteSystem obj = new AutocompleteSystem(["i love you", "island", "iroman", "i love leetcode"], [5, 3, 2, 2]);
obj.input("i"); // 返回 ["i love you", "island", "i love leetcode"]。有四个句子以"i"开头。其中,"ironman"和"i love leetcode"的热度相同。由于空格的 ASCII 码是 32,而 r 的 ASCII 码是 114,所以“i love leetcode”应排在“ironman”前面。同时我们只需要输出前三句热门句子,因此“ironman”会被忽略。
obj.input(" "); // 返回 ["i love you", "i love leetcode"]。只有两个句子以“i ”为前缀。
obj.input("a"); // 返回 []。没有以“i a”为前缀的句子。
obj.input("#"); // 返回 []。用户完成输入,句子 "i a" 应该被保存为系统中的历史句子。接下来的输入将被视为新的搜索。
classTrie:def__init__(self):self.children=[None]*27self.v=0self.w=''definsert(self,w,t):node=selfforcinw:idx=26ifc==' 'elseord(c)-ord('a')ifnode.children[idx]isNone:node.children[idx]=Trie()node=node.children[idx]node.v+=tnode.w=wdefsearch(self,pref):node=selfforcinpref:idx=26ifc==' 'elseord(c)-ord('a')ifnode.children[idx]isNone:returnNonenode=node.children[idx]returnnodeclassAutocompleteSystem:def__init__(self,sentences:List[str],times:List[int]):self.trie=Trie()fora,binzip(sentences,times):self.trie.insert(a,b)self.t=[]definput(self,c:str)->List[str]:defdfs(node):ifnodeisNone:returnifnode.v:res.append((node.v,node.w))fornxtinnode.children:dfs(nxt)ifc=='#':s=''.join(self.t)self.trie.insert(s,1)self.t=[]return[]res=[]self.t.append(c)node=self.trie.search(''.join(self.t))ifnodeisNone:returnresdfs(node)res.sort(key=lambdax:(-x[0],x[1]))return[v[1]forvinres[:3]]# Your AutocompleteSystem object will be instantiated and called as such:# obj = AutocompleteSystem(sentences, times)# param_1 = obj.input(c)
classTrie{Trie[]children=newTrie[27];intv;Stringw="";voidinsert(Stringw,intt){Trienode=this;for(charc:w.toCharArray()){intidx=c==' '?26:c-'a';if(node.children[idx]==null){node.children[idx]=newTrie();}node=node.children[idx];}node.v+=t;node.w=w;}Triesearch(Stringpref){Trienode=this;for(charc:pref.toCharArray()){intidx=c==' '?26:c-'a';if(node.children[idx]==null){returnnull;}node=node.children[idx];}returnnode;}}classAutocompleteSystem{privateTrietrie=newTrie();privateStringBuildert=newStringBuilder();publicAutocompleteSystem(String[]sentences,int[]times){inti=0;for(Strings:sentences){trie.insert(s,times[i++]);}}publicList<String>input(charc){List<String>res=newArrayList<>();if(c=='#'){trie.insert(t.toString(),1);t=newStringBuilder();returnres;}t.append(c);Trienode=trie.search(t.toString());if(node==null){returnres;}PriorityQueue<Trie>q=newPriorityQueue<>((a,b)->a.v==b.v?b.w.compareTo(a.w):a.v-b.v);dfs(node,q);while(!q.isEmpty()){res.add(0,q.poll().w);}returnres;}privatevoiddfs(Trienode,PriorityQueueq){if(node==null){return;}if(node.v>0){q.offer(node);if(q.size()>3){q.poll();}}for(Trienxt:node.children){dfs(nxt,q);}}}/** * Your AutocompleteSystem object will be instantiated and called as such: * AutocompleteSystem obj = new AutocompleteSystem(sentences, times); * List<String> param_1 = obj.input(c); */