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

主题:使用回溯背后的直觉(而不仅仅是递归DFS)

冯皓
2023-03-14

给定word=“abcced”,返回true。

一个被高度否决的解决方案如下:

public class Solution {
public boolean exist(char[][] board, String word) {
    for(int i = 0; i < board.length; i++)
        for(int j = 0; j < board[0].length; j++){
            if(exist(board, i, j, word, 0))
                return true;
        }
    return false;
}
private boolean exist(char[][] board, int i, int j, String word, int ind){
    if(ind == word.length()) return true;
    if(i > board.length-1 || i <0 || j<0 || j >board[0].length-1 || board[i][j]!=word.charAt(ind))
        return false;
    board[i][j]='*';
    boolean result =    exist(board, i-1, j, word, ind+1) ||
                        exist(board, i, j-1, word, ind+1) ||
                        exist(board, i, j+1, word, ind+1) ||
                        exist(board, i+1, j, word, ind+1);
    board[i][j] = word.charAt(ind);     //--> why?
    return result;
}

我的问题是--与使用普通递归DFS相比,使用回溯algo来解决这个问题背后的直觉是什么?在使用递归DFS时,我只需将节点标记为已访问节点,然后转移到它的邻居(因此发现abcced是有效路径)。为什么我必须回溯(上面代码中的注释行)来实现此路径是否存在?

共有1个答案

董飞航
2023-03-14

深度优先搜索是一种回溯算法。递归性的本质是回溯机制本身。如果路径不是好路径,则在深入树之前返回一个false。以下是您的回溯:

if(i > board.length-1 || i <0 || j<0 || j >board[0].length-1 || board[i][j]!=word.charAt(ind))
    return false;

线路

board[i][j] = word.charAt(ind);

正如Bakon Jarser在问题帖子中评论的那样,它只是用来将节点重置回它的原始值,并允许它在其他相邻路径中使用。

 类似资料:
  • 我正在解决leetcode.com上的单词搜索问题: 给定一个二维板和一个单词,找出这个单词是否存在于网格中。 我用在线帮助编写的解决方案如下: 我的问题很简单--为什么我们使用回溯方法,而不仅仅是传统的DFS?与我们所做的非常相似,我们可以从每个字符开始,然后进行DFS来确定是否可以找到目标词。但我们没有这样做,为什么? 我对它想了很多,得出了以下推理,但我不确定--我们使用回溯方法,因为同一个

  • 我正在开发高级培养皿网络编辑器/模拟器。首先,这里有一些词汇 圆圈=位置 矩形=过渡 就地整数 = 标记 过渡状态=防护 我被困在通过过渡的守卫。守卫是一个条件,如果你想执行转换,这需要是真的。我知道我应该以某种方式使用回溯,但我不知道在程序开始之前进入过渡的位置数,所以我不能使用循环,因为我不知道我需要多少个循环。 所以,我想从第一位获取第一个令牌,从第二位获取第一令牌,然后尝试通过守卫,如果通

  • 我编写了一个算法,用于返回一组数字的子集是否将使用回溯和递归(返回真/假)与给定目标求和 例如:{5,2,3,6},目标为8== 我想修改我的算法,以便它包括集合中可能存在的所有5。我很难用回溯和递归来解决这个问题。任何建议都不胜感激 例如:{5,2,3,6}目标8== 我写了一个算法,递归地包含一个数字并检查总和,然后从总和中省略该数字,但我不知道如何修改我的算法,只选择某个数字并将其包含在总和

  • 我正在编写一个python类来寻找8皇后问题的解决方案。如何在方法中正确实现回溯?我认为递归应该可以工作,但是,程序在第一次尝试没有找到解决方案后停止,回溯也不会发生。所有helper方法都能正常工作。 我的问题是在添加女王之前缺少一个板子的深度副本,还是仅仅是缺少回溯?

  • 本文向大家介绍python 使用递归回溯完美解决八皇后的问题,包括了python 使用递归回溯完美解决八皇后的问题的使用技巧和注意事项,需要的朋友参考一下 八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法。 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元素代表一行,就能达到要求 任意两个棋子不能在

  • 我对编码还是很陌生的,我正在尝试一些稍微困难的主题,例如修改数独递归回溯程序的解决方案。最初的解决方案是针对大小为3x3的数独,我希望我的解决方案可以与正常大小的数独(9x9)一起使用。3x3解决方案在这里找到。 我觉得我对算法非常了解:对于网格中的每个列表(包含该单元格的可能值),在每一步尝试每个数字,确保电路板仍然有效,移动到下一个列表,分配一个可能的数字直到其有效,等等。如果当前电路板不正确