dfs-矩阵中的路径-JZ65

描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如

在这里插入图片描述

矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

示例1

输入: [[a,b,c,e],[s,f,c,s],[a,d,e,e]],“abcced”
返回值: true

示例2

输入: [[a,b,c,e],[s,f,c,s],[a,d,e,e]],“abcb”
返回值: false

备注:
0 <= matrix.length <= 200
0 <= matrix[i].length <= 200

思路:
看到矩形路径,直接就想到了dfs解决问题
dfs-矩阵中的路径-JZ65_第1张图片

时间复杂度:O(mn*k^3),m和n是矩阵的宽和高,最坏的情况下遍历矩阵的所有位置,k是字符串的长度,下面的dfs我们可以把它看做是一棵4叉树,除了第一次的时候可以往4个方向走,其他情况下只能往3个方向走(进来的那个方向回不去)
空间复杂度:O(K),k是字符串的长度

代码

import java.util.*;


public class Solution {
    public boolean hasPath (char[][] matrix, String word) {
        if (matrix == null || word == null || word.length() == 0) {
            return false;
        }
        char[] words = word.toCharArray();
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (dfs(matrix, words, i, j, 0)) {
                    return true;
                }
            }
        }
        return false;
    }
    //index表示的是查找到字符串word的第几个字符   i,j表示当前判断矩阵中的位置
    private boolean dfs(char[][] matrix, char[] words, int i, int j, int index) {
        //如果越界或者当前位置与对应字符数组中的不匹配  返回falsze
        if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length 
            || matrix[i][j] != words[index]) {
            return false;
        }
        //最后一个字符判断符合要求 返回true 
        if (index == words.length-1) {
            return true;
        }
        char temp = matrix[i][j];
        //临时把对应矩形位置的字符替换为! 代表已经访问过 
        matrix[i][j] = '!';
        //递归判断上下左右4个方向的结果  
        boolean res = dfs(matrix, words, i-1, j, index+1) 
            || dfs(matrix, words, i+1, j, index+1) 
            || dfs(matrix, words, i, j-1, index+1) 
            || dfs(matrix, words, i, j+1, index+1); 
        //递归后字符还原
        matrix[i][j] = temp;
        return res;
    }
}

你可能感兴趣的:(剑指offer,剑指offer,矩阵中的路径,dfs,回溯,java)