如果不考慮正規表達的話,那其實就是最基本的Trie,還不了解trie的話可以參考前一篇文章!但現在多了這個特殊條件後,我們就需要去考慮所有可能,方法是寫一個dfs(Depth First Search)的輔助函式,遇到.的話就將當前節點下的所有子節點再帶入dfs,看最後有沒有符合的單字,只要有其中一個子節點符合的話會提前回傳true,都沒有的話就回傳false。
defaddWord(self, word: str) -> None: curr = self.root for w in word: if w notin curr: curr[w] = {} curr = curr[w] curr["#"] = True
defsearch(self, word: str) -> bool: n = len(word)
defdfs(curr, start): for i inrange(start, n): w = word[i] # 遇到 . if w == ".": # 用迴圈造訪所有可能路徑 for c in curr: # 避開結尾標記 && 該路徑有符合答案者 if c!="#"and dfs(curr[c], i+1): # 提前回傳 true returnTrue # 全部路徑無答案,回傳 false returnFalse elif w in curr: curr = curr[w] else: returnFalse return"#"in curr