class Solution:
def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
trie = {}
for word in words:
t = trie
for w in word:
t = t.setdefault(w, {})
t["end"] = 1
print(trie)
res = []
row = len(board)
col = len(board[0])
direction = [(-1, 0), (1, 0), (0, 1), (0, -1)]
def dfs(i, j, trie, s):
c = board[i][j]
if c not in trie:
return
trie = trie[c]
if "end" in trie and trie["end"] == 1:
res.append(s+c)
trie["end"] = 0
board[i][j] = "#"
for x, y in direction:
tmp_i = x+i
tmp_j = y+j
if 0 <= tmp_i and tmp_i < row and 0 <= tmp_j \
and tmp_j < col and board[tmp_i][tmp_j] != "#":
dfs(tmp_i, tmp_j, trie, s+c)
board[i][j] = c
for i in range(row):
for j in range(col):
dfs(i, j, trie, "")
return res
Runtime: 280 ms, faster than 82.03% of Python3 online submissions for Word Search II.
Memory Usage: 28.7 MB, less than 91.67% of Python3 online submissions for Word Search II.
前缀树
class TrieNode():
def __init__(self):
self.children = collections.defaultdict(TrieNode)
self.isWord = False
class Trie():
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for w in word:
node = node.children[w]
node.isWord = True
def search(self, word):
node = self.root
for w in word:
node = node.children.get(w)
if not node:
return False
return node.isWord
class Solution(object):
def findWords(self, board, words):
res = []
trie = Trie()
node = trie.root
for w in words:
trie.insert(w)
for i in range(len(board)):
for j in range(len(board[0])):
self.dfs(board, node, i, j, "", res)
return res
def dfs(self, board, node, i, j, path, res):
if node.isWord:
res.append(path)
node.isWord = False
if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]):
return
tmp = board[i][j]
node = node.children.get(tmp)
if not node:
return
board[i][j] = "#"
self.dfs(board, node, i+1, j, path+tmp, res)
self.dfs(board, node, i-1, j, path+tmp, res)
self.dfs(board, node, i, j-1, path+tmp, res)
self.dfs(board, node, i, j+1, path+tmp, res)
board[i][j] = tmp
Runtime: 440 ms, faster than 30.82% of Python3 online submissions for Word Search II.
Memory Usage: 36 MB, less than 66.67% of Python3 online submissions for Word Search II.