Sword se refiere a la Oferta 12. La ruta en el método de retroceso de matriz DFS

Diseñe una función para determinar si hay una ruta que contenga todos los caracteres de una cadena en una matriz. La ruta puede comenzar desde cualquier cuadrícula en la matriz, y cada paso puede mover una cuadrícula hacia la izquierda, derecha, arriba y abajo en la matriz. Si una ruta pasa a través de una cuadrícula de la matriz, la ruta no puede volver a ingresar a la cuadrícula. Por ejemplo, la siguiente matriz de 3 × 4 contiene una ruta para la cadena de caracteres "bfce" (las letras de la ruta están marcadas en negrita).

[[“A”, “b”, “c”, “e”],
[“s”, “f”, “c”, “s”],
[“a”, “d”, “e”, "mi"]]

Pero la matriz no contiene la ruta de la cadena "abfb", porque después de que el primer carácter b de la cadena ocupa la segunda cuadrícula en la primera fila de la matriz, la ruta no puede ingresar a esta cuadrícula nuevamente.

Ejemplo 1:

Entrada: tablero = [["A", "B", "C", "E"], ["S", "F", "C", "S"], ["A", "D", "E", "E"]], palabra = "ABCCED"
Salida: verdadero
Ejemplo 2:

Entrada: tablero = [["a", "b"], ["c", "d"]], palabra = "abcd"
Salida: falso

Fuente:
Enlace de LeetCode : Haga clic para ir a https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof

//回溯法,又称深度优先搜索(DFS)
class Solution {
    
    
    //函数返回是否存在该路径
    public boolean exist(char[][] board, String word) {
    
    
        char[] ch = word.toCharArray();
        //判断位置是否被走过,默认false:没走过
        boolean[][] isused = new boolean[board.length][board[0].length];
        //循环遍历二维数组每个位置
        for(int i = 0; i < board.length; i++) {
    
    
            for(int j = 0; j < board[0].length; j++) {
    
    
                //然后每个位置判断是否可以达成word路径
                if(dfs(board, ch, isused, i, j, 0)) return true;
            }
        }
        return false;
    }

    //递归每个位置,回溯法:先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推
    public boolean dfs(char[][] board, char[] ch, boolean[][] isused, int i, int j, int index) {
    
    
        //不符合word路径的条件
        //1.该位置越界
        //2.board(i,j)位置不符合word(index)位置
        //3.该位置已经走过
        if(i < 0 || j < 0 || i >= board.length || j >= board[0].length || board[i][j] != ch[index] || isused[i][j]) {
    
    
            return false;
        }
        //符合word路径的条件:
        if(index == ch.length-1) {
    
    
            return true;
        }
        //已经走过这个位置了
        isused[i][j] = true;
        //step先向上一直搜索,不行了再回溯上一个节点,再向下。。。再向左。。。再向右。。。
        boolean step = false;
        step = dfs(board, ch, isused, i-1, j, index+1) ||
                dfs(board, ch, isused, i+1, j, index+1) ||
                dfs(board, ch, isused, i, j-1, index+1) ||
                dfs(board, ch, isused, i, j+1, index+1);
        //因为走不下去,退回到上一位置了,所以该位置重置为false:没走过
        isused[i][j] = false;
        return step;
    }
}

Supongo que te gusta

Origin blog.csdn.net/starry1441/article/details/114800823
Recomendado
Clasificación