211. 添加与搜索单词 - 数据结构设计

Difficulty
Medium
Tags
前缀树
URL
https://leetcode.cn/problems/design-add-and-search-words-data-structure/
Star
请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary
  • WordDictionary() 初始化词典对象
  • void addWord(word)word 添加到数据结构中,之后可以对它进行匹配
  • bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回 falseword 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。
示例:
输入: ["WordDictionary","addWord","addWord","addWord","search","search","search","search"] [[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]] 输出: [null,null,null,null,false,true,true,true] 解释: WordDictionary wordDictionary = new WordDictionary(); wordDictionary.addWord("bad"); wordDictionary.addWord("dad"); wordDictionary.addWord("mad"); wordDictionary.search("pad"); // 返回 False wordDictionary.search("bad"); // 返回 True wordDictionary.search(".ad"); // 返回 True wordDictionary.search("b.."); // 返回 True
提示:
  • 1 <= word.length <= 25
  • addWord 中的 word 由小写英文字母组成
  • search 中的 word 由 '.' 或小写英文字母组成
  • 最多调用 104addWordsearch

前缀树

思路
几乎是模板题!只是本题查询的单词有万能匹配字符.
题解
class Node: def __init__(self): self.child = {} self.is_word = None class WordDictionary: def __init__(self): self.root = Node() def addWord(self, word: str) -> None: node = self.root for char in word: if char not in node.child: node.child[char] = Node() node = node.child[char] node.is_word = True def search(self, word: str) -> bool: return self.dfs(node=self.root, word=word, start=0) def dfs(self, node, word, start): if start >= len(word): if node.is_word: return True return False for key, child_node in node.child.items(): if word[start] == "." or key == word[start]: if self.dfs(child_node, word, start+1): return True return False # Your WordDictionary object will be instantiated and called as such: # obj = WordDictionary() # obj.addWord(word) # param_2 = obj.search(word)