class WordDictionary:
def __init__(self):
self.root = Node()
def addWord(self, word: str) -> None:
node = self.root
for c in word:
if c not in node.children:
node.children[c] = Node()
node = node.children[c]
node.end = True
def search(self, word: str) -> bool:
# return self.bfs(self.root, word, 0)
return self.bfs(self.root, word)
def bfs(self, node, word):
queue = deque([(node, 0)])
n = len(word)
while len(queue) > 0:
size = len(queue)
for _ in range(size):
node, idx = queue.pop()
if idx == n:
if node.end:
return True
else:
continue
c = word[idx]
if c != '.':
if c in node.children:
queue.append((node.children[c], idx + 1))
else:
for key in node.children:
queue.append((node.children[key], idx + 1))
return False
def dfs(self, node, word, idx):
if idx == len(word):
return node.end
c = word[idx]
if c != '.':
if c not in node.children:
return False
return self.dfs(node.children[c], word, idx+1)
for key in node.children:
res = self.dfs(node.children[key], word, idx + 1)
if res:
return res
return False
class Node:
def __init__(self):
self.children = {}
self.end = False