23. 矩阵中的路径-DFS

题意

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。

如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。

注意:

输入的路径不为空;
所有出现的字符均为大写英文字母;
样例
matrix=
[
[“A”,“B”,“C”,“E”],
[“S”,“F”,“C”,“S”],
[“A”,“D”,“E”,“E”]
]

str=“BCCE” , return “true”

str=“ASAE” , return “false”

遇到的问题

首先题目读错了意思,以为是随便选择,不能连续路径,因此初始化的时候只选择了[0][0]点,后重新审题后修改了多了两层循环;
判断越界的时候将if(i < 0 || j<0 || i>=row || j>=col || visited[i][j] || (matrix[i][j]!=str.charAt(len)))放到了遍历的外层,导致一直被visited;
第一个点的判断,开始的样例的路径头不在第一个||样例集合只有一个元素,因此默认了满足条件,当样例只有一个元素的时候没法满足,所以把遍历的元素加了一个原点
static int []di = {0,1,0,-1,0}; static int []dj = {0,0,1,0,-1};

class Solution {
    static int []di = {0,1,0,-1,0};
    static int []dj = {0,0,1,0,-1};
    
    static boolean dfs(char[][] matrix, String str, int i, int j, int row, int col, boolean [][]visited, int len){
        if(str.length()==len){
            return true;
        }
        for(int k = 0; k <= 4; k++){
            i += di[k];
            j += dj[k];
            if(i < 0 || j<0 || i>=row || j>=col || visited[i][j] || (matrix[i][j]!=str.charAt(len))){
                i -= di[k];
                j -= dj[k];
                continue;
            }
            visited[i][j] = true;
            if (dfs(matrix, str, i, j, row, col, visited, len+1)){
                return true;
            }
            visited[i][j] = false;
            i -= di[k];
            j -= dj[k];
        }
        return false;
    } 
    
    public boolean hasPath(char[][] matrix, String str) {
        if(matrix.length==0 || matrix[0].length==0){
            return false;
        }
        int row = matrix.length;
        int col = matrix[0].length;
        for (int l = 0;  l< row ; l++){
            for(int o = 0; o < col; o++){
                boolean [][]visited = new boolean[row][col];
                if(dfs(matrix, str, l, o, row, col, visited, 0)){
                    return true;
                }
            }
        }
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值