8.28 - hard - 114

642. Design Search Autocomplete System

這題要多做幾遍,很好的設(shè)計題

_trie = lambda: collections.defaultdict(_trie)
INFO, END = True, False

class ShortList(list):
    def append(self, val):
        for i, (nt, s) in enumerate(self):
            if s == val[1]:
                self[i] = val
                break
        else:
            list.append(self, val)
        
        self.sort()
        if len(self) > 3:
            self.pop()

class AutocompleteSystem(object):
    
    def __init__(self, sentences, counts):
        self.curnode = self.trie = _trie()
        self.sentence_to_count = collections.Counter()
        self.search = ''
        
        for sentence, count in zip(sentences, counts):
            self.add(sentence, count)
    
    def add(self, sentence, count):
        self.sentence_to_count[sentence] = count
        cur = self.trie
        self._add_info(cur, sentence, count)
        for letter in sentence:
            cur = cur[letter]
            self._add_info(cur, sentence, count)
        cur[END] = sentence
    
    def _add_info(self, node, sentence, count):
        if INFO not in node:
            node[INFO] = ShortList()
        node[INFO].append((-count, sentence))
        
    def input(self, c):
        if c != '#':
            self.search += c
            if self.curnode is None:
                return []
            if c not in self.curnode:
                self.curnode = None
                return []
            
            self.curnode = self.curnode[c]
            return [s for nt, s in self.curnode[INFO]]
        else:
            self.sentence_to_count[self.search] += 1
            self.add(self.search, self.sentence_to_count[self.search])
            self.search = ''
            self.curnode = self.trie
            return []


# Your AutocompleteSystem object will be instantiated and called as such:
# obj = AutocompleteSystem(sentences, times)
# param_1 = obj.input(c)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 639. Decode Ways II 雖然競賽時候這道題AC了,不過寫的code 狗啃一般,找了一個清爽的答案,...
    健時總向亂中忙閱讀 91評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,349評論 25 708
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評論 18 399
  • 畢業(yè)了,幼兒園畢業(yè),小學(xué)畢業(yè),中學(xué)畢業(yè)。人的一生都要經(jīng)歷幾次畢業(yè)。是傷感的,是滿足的,是希望的。 離別充滿傷感。 ...
    ai小鹿梅花閱讀 258評論 0 0
  • 以下內(nèi)容有的源于相關(guān)大神(張亮老師,黃有璨老師)言論,有的源于我自己的理解。 1.如何理解產(chǎn)品不足運營補? 哪些產(chǎn)...
    破曉之后閱讀 379評論 0 2