题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
思路:
1.首先遍历矩阵,找到第一个字符的下标x,y
2.递归调用hasNextPath
3.hasNextPath 有两个功能,一是检测当前坐标x、y下的值str的值是否对应相等,如果不等,返回;二是查找下一个位置的值
代码中使用二维boolean变量记录已经走过的路径,递归查找时,如果找到最后发现路径不对,paths值需置为false,认为该路径上未走过;
代码:
public class Solution { public static void main(String[] args) { System.out.print(hasPath("ABCESFCSADEE".toCharArray(), 3, 4, "ABCCED".toCharArray())); } public static boolean hasPath(char[] matrix, int rows, int cols, char[] str) { char[][] paths = new char[rows][cols]; int index = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { paths[i][j] = matrix[index++]; } } for (int i = 0; i < paths.length; i++) { for (int j = 0; j < paths[0].length; j++) { if (paths[i][j] == str[0]) { boolean[][] results = new boolean[rows][cols]; if (hasNextPath(results, paths, i, j, str, 0)) { System.out.println("i :" + i + " j: " + j); return true; } } } } return false; } public static boolean hasNextPath(boolean[][] path, char[][] matrix, int x, int y, char[] str, int start) { if (start >= str.length) { return true; } if (!checkPath(path, matrix, x, y, str, start)) { return false; } path[x][y] = true; boolean result = hasNextPath(path, matrix, x - 1, y, str, start + 1) | hasNextPath(path, matrix, x + 1, y, str, start + 1) | hasNextPath(path, matrix, x, y - 1, str, start + 1) | hasNextPath(path, matrix, x, y + 1, str, start + 1); if (result) { return true; } path[x][y] = false; return false; } private static boolean checkPath(boolean[][] path, char[][] matrix, int x, int y, char[] str, int start) { if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length || path[x][y] || matrix[x][y] != str[start]) { return false; } System.out.println("check succes " + matrix[x][y]); return true; } }