题目链接
题目描述
判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向上下左右移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
解题思路
回溯思想,注意给的array是char[],不是char[][],需要我们手动转换一下
public class Solution {
private int[][] directions = {
{
-1, 0}, {
1, 0}, {
0, -1}, {
0, 1}};
private int m, n;
public boolean hasPath(char[] array, int rows, int cols, char[] str){
if (rows==0 || cols==0) return false;
m = rows; n = cols;
char[][] matrix = makeMatrix(array);
boolean[][] marked = new boolean[m][n];
for (int i=0;i<m;i++) {
for (int j=0;j<n;j++) {
if (backtracking(matrix, i, j, marked, 0, str)) return true;
}
}
return false;
}
private boolean backtracking(char[][] matrix, int i, int j, boolean[][] marked, int level, char[] str) {
if (level==str.length) return true;
if (i<0 || i>=m || j<0 || j>=n || marked[i][j] || matrix[i][j]!=str[level]) return false;
marked[i][j] = true;
for (int[] d: directions) {
if (backtracking(matrix, i+d[0], j+d[1], marked, level+1, str)) return true;
}
marked[i][j] = false;
return false;
}
private char[][] makeMatrix(char[] matrix) {
char[][] res = new char[m][n];
int idx = 0;
for (int i=0;i<m;i++) {
for (int j=0;j<n;j++) {
res[i][j] = matrix[idx++];
}
}
return res;
}
}