Java 将节点标记为在DFS中访问以进行单词搜索

Java 将节点标记为在DFS中访问以进行单词搜索,java,algorithm,recursion,graph,depth-first-search,Java,Algorithm,Recursion,Graph,Depth First Search,这是leetcode上的单词搜索问题。我在下面提供了一张图片,很好地解释了这一点。我的方法是在电路板中的每个字母上都有一个DFS(通过迭代双for循环),我这样做是为了让我的DFS函数可以从每个字母开始,我可以得到所有不同的单词 我通过传入一个布尔数组将节点标记为已访问,如果我看到该节点,则该值将更改为true,如果该节点未指向路径,则该值将更改回false。我想这就是我搞砸的地方。我不确定如何正确地将节点标记为已访问的节点,如果我不这样做,则会得到一个无限循环 当我运行我的程序并打印出dfs正

这是leetcode上的单词搜索问题。我在下面提供了一张图片,很好地解释了这一点。我的方法是在电路板中的每个字母上都有一个DFS(通过迭代双for循环),我这样做是为了让我的DFS函数可以从每个字母开始,我可以得到所有不同的单词

我通过传入一个布尔数组将节点标记为已访问,如果我看到该节点,则该值将更改为true,如果该节点未指向路径,则该值将更改回false。我想这就是我搞砸的地方。我不确定如何正确地将节点标记为已访问的节点,如果我不这样做,则会得到一个无限循环

当我运行我的程序并打印出dfs正在生成的字符串时,我没有得到所有可能的字符串。这就是我想弄明白的,如何得到所有的字符串

您也可以在leetcode中运行代码。谢谢大家!

类解决方案{
公共布尔存在(字符[][]板,字符串字){
if(board==null | | word==null){
返回false;
}
对于(int i=0;i=0&&row=0&&col
给定输入的预期输出是什么?实际输出是什么?当程序应该输出true时,程序输出false并带有“ABCCED”字样。检查正在构建的单词时,我看到一个AB ABC ABCE ABCES ABCESE ABCESEEE ABCESEED ABCESEEDA ABCESEEDAS ABCESEEDASF ABCESEEDASFC ABCEEDF ABCESEEDFD ABCEEDFDA ABCESEEDFDAS——但我没有看到它构建任何以ABCC开头的字符串。不确定给定输入的预期输出是什么?实际输出是什么?当程序应该输出true时,程序输出false并带有“ABCCED”字样。在构建单词的过程中,我看到一个AB ABC ABCE ABCES ABCESE ABCESEEE ABCESEEDA ABCESEEDAS ABCESEEDASF ABCESEEDASFC ABCEEDF ABCESEEDFD ABCEEDFDA ABCESEEDFDAS——但我没有看到它构建任何以ABCC开头的字符串。不确定为什么
class Solution {
    public boolean exist(char[][] board, String word) {
        
        if(board == null || word == null) {
            return false;
        }
        
        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[i].length; j++) {
                List<Character> tempList = new ArrayList<>();
                tempList.add(board[i][j]);
                boolean[][] tempBoard = new boolean[board.length][board[0].length];
                if(wordExists(i, j, word, tempList, board, tempBoard)) {
                    return true;
                } 
                else{
                     tempList.remove(tempList.size() - 1);
                }
            }
        }   
        return false;
    }
    
    public static boolean wordExists(int sr, int sc, String word, List<Character> list, char[][] board, boolean[][] tempBoard) {
        StringBuilder sb = new StringBuilder();
        for(Character c : list) {
            sb.append(c);
        }
        
        System.out.println(sb.toString());
        
        if(word.equals(sb.toString())) {
            return true;
        }
        
        final int[][] SHIFTS = {
            {0,1},
            {1,0},
            {0,-1},
            {-1,0}
        };
        tempBoard[sr][sc] = true;
        for(int[] shift : SHIFTS) {
            int row = sr + shift[0];
            int col = sc + shift[1];
            
            if(isValid(board, row, col, tempBoard)) {
                list.add(board[row][col]);
                
                if(wordExists(row, col, word, list, board, tempBoard)) {
                    return true;
                }
                tempBoard[sr][sc] = false;
                list.remove(list.size() - 1);
            }
        }
        return false;
    }
    
    public static boolean isValid(char[][] board, int row, int col, boolean[][] tempBoard) {
        if(row >= 0 && row < board.length && col >= 0 && col < board[row].length && tempBoard[row][col] != true) {
            return true;
        }
        return false;
    }
    
}