矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

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

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

示例 1:

输入:board = [[“A”,”B”,”C”,”E”],[“S”,”F”,”C”,”S”],[“A”,”D”,”E”,”E”]], word = “ABCCED”
输出:true

示例 2:

输入:board = [[“a”,”b”],[“c”,”d”]], word = “abcd”
输出:false

提示:

  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200

解答

遍历每一个起点。从每一个起点开始尝试走

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Solution {
public boolean exist(char[][] board, String word) {
char[] chars = word.toCharArray();
//依次判断,每一个起点
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {

//每次都从当前节点,从k=0开始尝试,只要有满足一条路径,return true
if (dfs(board, i, j, chars, 0)) {
return true;
}
}
}

//都不吗满足
return false;
}


//当前匹配的节点K
public boolean dfs(char[][] board,int i,int j,char[] chars,int k){

//越界了
if(i >= board.length || i < 0 || j >= board[0].length || j < 0)
return false;

//当前k不满足,说明这条路走不通
if (board[i][j] != chars[k]) {
return false;
}

//说明当前满足条件,实际上K+1

//走到,最后一个了K,满足条件
if (k+1 == chars.length) {
return true;
}


//不是走到的最后一个,还要继续判断,依次,上下左右尝试着走

//这个做个标记,回溯,剪枝
char temp = board[i][j];
//标记当前路径,走过了
board[i][j] = '\n';
boolean res = dfs(board, i + 1, j, chars,k + 1)
|| dfs(board, i - 1, j, chars,k + 1)
|| dfs(board, i, j + 1, chars,k + 1)
|| dfs(board, i , j - 1, chars,k + 1);

//回退的时候,去掉标记
board[i][j] = temp;
return res;

}

}