矩阵中的路径

矩阵中的路径

题目描述

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

示例

示例 1:

1
2
输入:board = [["A", "B", "C", "E"], ["S", "F", "C", "S"], ["A", "D", "E", "E"]], word = "ABCCED"
输出:true

示例 2:

1
2
输入:board = [["a", "b"], ["c", "d"]], word = "abcd"
输出:false

限制

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

题目来源:力扣(LeetCode)
题目链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
题目著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一

可以对矩阵中的每个元素采用回溯的方法进行尝试,若以该节点有一条路径满足条件则返回。

在回溯的过程中要记录已经访问的节点,回溯之后还要注意将访问标志恢复。

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
class Solution {
private char[] word;
private char[][] board;
private boolean[][] visited;
private int[][] directions = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
private int m;
private int n;
public boolean exist(char[][] board, String word) {
if (board == null || board.length == 0) return false;
this.word = word.toCharArray();
this.board = board;
this.m = board.length;
this.n = board[0].length;
this.visited = new boolean[m][n];
for (int i = 0; i < board.length; i++) {
char[] inner = board[i];
for (int j = 0; j < inner.length; j++) {
if(dfs(i, j, 0)) return true;
}
}
return false;
}

private boolean dfs(int i, int j, int index) {
if (board[i][j] != word[index]) return false;
if (index == word.length - 1) return true;
this.visited[i][j] = true;
boolean result = false;
for (int[] direction : directions) {
int x = i + direction[0];
int y = j + direction[1];
if (x < 0 || x > m - 1 || y < 0 || y > n - 1 || visited[x][y]) continue;
if(dfs(x, y, index + 1)) return true;
}
this.visited[i][j] = false;
return false;
}
}