Leetcode——矩阵中的路径(回溯,剪枝)

Posted Yawn,

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——矩阵中的路径(回溯,剪枝)相关的知识,希望对你有一定的参考价值。

1. 题目

2. 题解

  • 遍历每个单词的所有方向,符合条件的继续,不符合的回溯,重置状态。
class Solution {
    int m = 0;
    int n = 0;
    boolean[][] visited;
    int[][] direct = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};

    public boolean exist(char[][] board, String word) {
        m = board.length;
        n = board[0].length;
        visited = new boolean[m][n];
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                //起点如果不是word的首字符,那就跳过当前位置,不从这里开始遍历
                if(board[i][j] != word.charAt(0)){
                    continue;
                }
                //如果从(i,j)开始遍历能找到word在网络中,则返回true;否则继续从头开始遍历
                if(findWord(board,word,i,j,0,visited)){
                    return true;
                }
            }
        }
        return false;
    }

    private boolean findWord(char[][] board, String word, int i, int j, int cur,boolean[][] visited){
        //如果cur指针越界了,则证明已经找到与word匹配的所有字符了
        if(cur==word.length()){
            return true;
        }
        //i和j如果越界则返回false
        if(i<0 || j<0 || i>=m || j>=n){
            return false;
        }
        
        //如果当前网络字符不等于word的第cur个字符
        //或者当前字符已经被访问,则false (防止出现A-》B,B忘四个方向遍历时,又回退导致遍历了两次A)
        if(board[i][j] != word.charAt(cur) || visited[i][j]){
            return false;
        }

        //回溯,标记已被访问
        visited[i][j] = true;

        //如果从当前点(i,j)散发的四个方向中有一个方向能成功匹配剩下的字母,则可以返回true
        for(int[] dir:direct){
            
            if(findWord(board,word,i+dir[0],j+dir[1],cur+1,visited)){
                return true;
            }
        }
        
        //当前节点所有方向都未找到目标值,恢复原有状态
        visited[i][j] = false;
        
        //前面如果没有找到完整匹配的结果则返回false
        return false;
    }
}

以上是关于Leetcode——矩阵中的路径(回溯,剪枝)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode12 矩阵中的路径 回溯算法

剑指offer搜索和回溯12. 矩阵中的路径

leetcode51.N皇后

基于剪枝的回溯法

基于剪枝的回溯法

基于剪枝的回溯法