微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Leetcode 79 词搜索问题与 BFS

如何解决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 举报,一经查实,本站将立刻删除。