当前位置: 首页 > 知识库问答 >
问题:

BFS中的Leetcode 79字搜索问题

汪翰墨
2023-03-14

我遇到了一个使用Python解决Leetcode79字搜索的问题。

给定一个m×n的字符板网格和一个字符串字,如果该网格中存在字,则返回true。

该字可以由顺序相邻单元格的字母构成,其中相邻单元格水平或垂直相邻。同一个字母单元格不能使用不止一次。

我试图使用一个字符队列和一个BFS来查看是否有一个单词存在于黑板上,但解决方案似乎对某些单词有效,而不是其他单词。例如,在第一个testcase中,访问的顺序似乎是[[0,0],[0,1],[0,2],[1,2],[0,3]]而不是预期的[[0,0],[0,1],[0,2],[1,2],[2,2],[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,0],[-1,0],[0,1],[0,-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
                        
                        ````

共有1个答案

翟理
2023-03-14

您正在尝试的算法有几个问题:

  • visited应该只收集当前路径上的节点。其他路径限制当前路径的自由是不对的。
  • mq.pop(0)将永远删除该字符,但是当您在不同的方向上循环时,所有这些迭代都应该与相同的mq字符进行比较...所以这是不对的。相反,您应该跟踪mq中的索引以便与之进行比较。这可以与队列中的行和列一起存储(作为第三个信息)。
  • BFS仅在startlist中的第一个单元格启动。startlist中的所有其他元素都可以有很好的开始位置,但从未尝试过。

使用DFS而不是BFS将更容易实现(并且使用更少的内存)。

 类似资料:
  • 我正在研究BFS算法,我有一个关于如何将相邻节点插入队列的问题。 例如,假设我们正在处理一个无向图,我们希望执行BFS来输出图的内容,那么我们如何知道在从队列中取出一个初始节点后,相邻节点以什么顺序插入到队列中呢?还有,有没有办法修改邻居节点插入队列的方式? 任何帮助都将不胜感激,谢谢。

  • 有一个最多有10,000个节点的图,每个节点最多可以有4个相邻节点。图是无权无向的。任务是寻找从节点A到节点B的最短路径,路径长度是路径中访问的节点数。BFS算法能在不到一秒钟的时间内找到路径并使用少于64MB的内存吗? 最初的问题是网格(最多100*100)和可以访问的地方,开始的地方,结束的地方,和不能访问的地方。我的第一个猜测是将其简化为使用BFS搜索在未加权图中寻找最短路径。但是,我不确定

  • 本篇将会结合实例解析宽度优先搜索(BFS)。 一、BFS概念 宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到

  • 查看BFS和DFS算法,它们似乎将节点标记为已访问。如果我只在树中导航,我的实现是否仍然需要将节点标记为已访问?我想对每个节点执行一次操作。 它似乎只适用于存在循环的图形,这样我就有可能两次碰到同一个节点。如果我递归地对一棵树进行调用,那么似乎不需要具有已访问状态,因为在堆栈中的所有调用返回到当前节点之后,我可以选择在节点上执行我想要的操作。我的假设正确吗? 谢谢

  • 1.添加了关键词不显示怎么回事? 检查添加的关键词用英文状态下的逗号“,”’隔开

  • 我在我的应用程序中使用Hibernate搜索。其中一个子集合映射为IndexeDemBedded。子对象有两个字段,一个是id,另一个是date(使用date resoultion到毫秒)。当我搜索ID=1(或某个值)并且date等于另一个值时,我会得到第一个和第二个匹配的所有情况的结果。我只想在同一个孩子中获得两个字段匹配的记录,但我在不同的孩子中获得匹配,结果会高得多。下面是代码片段 主类是用