之后我们用拼接的单词在 words 中查询即可, 最简单的方式当然是每次 query 都去扫描一次,这种方式时间复杂度为 $O(m n q)$,其中 m 和 n 分别为 words 的长度和, words[i] 的平均长度,m 和 n 最大为 2000,q 是待查项,最大为 40000, 毫无疑问会超时。
我们可以采用构建 Trie 的形式,即以空间环时间, 其代码和常规的 Trie 类似,只需要将 search(word) 函数做一个简单修改即可,我们不需要检查整个 word 是否存在, 而已 word 的前缀存在即可。
classTrie:def__init__(self):""" Initialize your data structure here. """ self.Trie ={}definsert(self,word):""" Inserts a word into the trie. :type word: str :rtype: void """ curr = self.Triefor w in word:if w notin curr: curr[w]={} curr = curr[w] curr['#']=1defsearch(self,word):""" Returns if the word is in the trie. :type word: str :rtype: bool """ curr = self.Triefor w in word:if w notin curr:returnFalseif"#"in curr[w]:returnTrue curr = curr[w]returnFalseclassStreamChecker:def__init__(self,words: List[str]): self.trie =Trie() self.stream =deque([])for word inset(words): self.trie.insert(word[::-1])defquery(self,letter:str) ->bool: self.stream.appendleft(letter)return self.trie.search(self.stream)