如何解决Leetcode 79 词搜索问题与 BFS
我遇到了使用 Python 解决 leetcode 79 字搜索的问题。
给定一个 m x n 的字符板网格和一个字符串单词,如果网格中存在单词,则返回 true。
单词可以由顺序相邻的单元格的字母构成,其中相邻的单元格水平或垂直相邻。同一个字母单元格不能多次使用。
我正在尝试使用字符队列和 BFS 来查看板上是否存在某个单词,但该解决方案似乎适用于某些单词而不是其他单词。例如在第一个测试用例中,访问的顺序似乎是 [[0,0],[0,1],2],[1,3]] 而不是预期的 [ [0,[2,1]]。我不确定是否有我忽略的错误(除了仅从一个起点进行测试,我希望在解决此问题后修复)。
class Solution(object):
def exist(self,board,word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
rows,cols=len(board),len(board[0])
directions=[[1,[-1,-1]]
word=str(word)
mq=list(word)
visited=[]
startlist=[]
#find all start points
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j]==mq[0]:
if [i,j] not in startlist:
startlist.append([i,j])
def bfs(r,c):
q=collections.deque()
q.append([r,c])
visited.append([r,c])
if board[r][c]==mq[0]:
mq.pop(0)
while q:
x,y=q.popleft()
for dx,dy in directions:
row,col=x+dx,y+dy
if row in range(rows):
if col in range(cols):
if mq:
if board[row][col]==mq[0]:
if [row,col] not in visited:
mq.pop(0)
visited.append([row,col])
q.append([row,col])
x,y=startlist[0]
bfs(x,y)
if not mq:
return True
else:
return False
````
解决方法
您尝试使用的算法存在几个问题:
-
visited
应该只收集当前路径上的节点。其他路径限制当前路径的自由度是不对的。 -
mq.pop(0)
将永远删除该字符,但是当您在不同方向上循环时,所有这些迭代都应该与 相同mq
字符进行比较......所以这是错误的.相反,您应该跟踪mq
中的索引以进行比较。这可以与队列中的行和列一起存储(作为第三信息)。 -
bfs
仅在startlist
中的第一个单元格上启动。startlist
中的所有其他元素都可以有很好的开始位置,但从未尝试过。
使用 DFS 而不是 BFS 会更容易实现(并且使用更少的内存)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。