我正在尝试使用python解决leetcode 79. word search,但是调试我的解决方案时遇到了一些麻烦。卡在测试用例上:{[[“ A”,“ B”,“ C”,“ E”],[“ S”,“ F”,“ E”,“ S”],[“ A”,“ D “,” E“,” E“]] “ ABCESEEEFS”},它不会通过上面的测试用例,需要一些帮助,谢谢。
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
def dfs(board, word, used, x, y):
if not word: return True
direction = [[0, 1],[0, -1],[1, 0],[-1, 0]]
if (0 <= x < len(board)) and (0 <= y < len(board[0])) and ((x, y) not in used) and (board[x][y] == word[0]):
used.add((x, y))
return (dfs(board, word[1:], used, x + direction[0][0], y + direction[0][1]) or
dfs(board, word[1:], used, x + direction[1][0], y + direction[1][1]) or
dfs(board, word[1:], used, x + direction[2][0], y + direction[2][1]) or
dfs(board, word[1:], used, x + direction[3][0], y + direction[3][1]))
return False
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(board, word, set(), i, j) == True: return True
return False
答案 0 :(得分:0)
您的问题是,当您将used
传递给递归dfs
时,实际上是传递了对该函数的引用。也就是说,当您从(0,0)
开始,然后转到(0,1)
,依此类推,您可能已经消耗了(1,1)
,它仅出现在序列的后面。
换句话说,used
将包含所有板级单元,远早于您要进行的搜索。
要解决此问题,请创建used
的副本并传递给递归dfs
:
for dx,dy in direction:
used_copy = set(used)
used_copy.add((x,y))
if dfs(board, word[1:], used_copy, x + dx, y + dy):
return True
return False
您还可以在每次递归(x,y)
调用之后删除dfs
,以免浪费内存:
used.add((x,y))
for dx,dy in direction:
if dfs(board, word[1:], used, x + dx, y + dy):
return True
used.remove((x,y))
return False