本文共 1943 字,大约阅读时间需要 6 分钟。
给定一个矩阵和一个目标字符串,判断矩阵中是否存在一个连续的路径,使得路径上的字符依次匹配目标字符串。例如,矩阵中的某个单元格为“X”,目标字符串为“XXX”,则需要检查是否存在三个连续的“X”。
为了解决这个问题,选择使用深度优先搜索(DFS)结合剪枝的方法。DFS能够暴力遍历矩阵,逐个检查每个单元格是否能作为目标字符串的起点。剪枝则通过提前终止不可能成功的路径,减少不必要的计算。
递归函数设计:
主函数逻辑:
剪枝优化:
package matrix;public class JZ12矩阵中的路径 { int[][] dirs = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; public boolean exist(char[][] board, String word) { int h = board.length; int w = board[0].length; boolean[][] visited = new boolean[h][w]; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (check(board, visited, i, j, word, 0)) { return true; } } } return false; } private boolean check(char[][] board, boolean[][] visited, int i, int j, String word, int k) { if (board[i][j] != word.charAt(k)) { return false; } if (k == word.length() - 1) { return true; } visited[i][j] = true; for (int[] dir : dirs) { int newi = i + dir[0]; int newj = j + dir[1]; if (newi >= 0 && newi < board.length && newj >= 0 && newj < board[0].length) { if (!visited[newi][newj]) { if (check(board, visited, newi, newj, word, k + 1)) { return true; } } } } visited[i][j] = false; return false; }} 通过DFS加剪枝的方法,可以高效地解决矩阵中的路径问题。该方法通过逐个检查每个单元格,并剪枝不可能的路径,确保在合理时间内找到目标字符串或确定其不存在。
转载地址:http://plhfk.baihongyu.com/