矩阵中的路径

题目:

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的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

 

解答:

深度优先遍历DFS,采用标记矩阵,对走过的路径进行标记,走完之后记得清除标记;注意边界判断以及终止条件判断,找到一条满足的路径即可;

 1 class Solution {
 2     public boolean exist(char[][] board, String word) {
 3 
 4         for (int i = 0; i < board.length; i++) {
 5             for (int j = 0; j < board[0].length; j++) {
 6                 boolean [][] mk = new boolean[board.length][board[0].length];
 7                 boolean exist = dfs(board, mk, i, j, word.toCharArray(), 0);
 8                 if (exist) {
 9                     return true;
10                 }
11             }
12         }
13         return false;
14     }
15     private boolean dfs(char[][] mat, boolean [][] mk, int r, int c, char [] str, int cur){
16         if(cur == str.length){
17             return true;
18         }
19         if(r < 0 || r == mat.length || c < 0 || c == mat[0].length){
20             return false;
21         }
22         if(mat[r][c] != str[cur] || mk[r][c]){
23             return false;
24         }
25         
26         mk[r][c] = true;
27         if(dfs(mat, mk, r+1, c, str, cur+1)
28           || dfs(mat, mk, r-1, c, str, cur+1)
29           || dfs(mat, mk, r, c-1, str, cur+1)
30           || dfs(mat, mk, r, c+1, str, cur+1)){
31             return true;
32         }
33         mk[r][c] = false;
34         return false;
35     }
36 }

 

posted @ 2020-04-18 00:22  heaven夏  阅读(131)  评论(0编辑  收藏  举报