class Solution { // 二维数组长 int n; // 宽 int m; // 字符串长度 int len; // 将字符串转换成字符数组 char[] letters; // 二维数组元素是否被访问过 boolean[][] visited; char[][] board; public boolean exist(char[][] board, String word) { this.n = board.length; this.m = board[0].length; this.len = word.length(); this.board = board; // 初始化布尔值 this.visited = new boolean[n][m]; this.letters = word.toCharArray(); // 遍历二维数组所有元素 for(int i = 0;i < n;i++){ for(int j = 0;j < m;j++){ // 每个元素都要递归 boolean res = search(i,j,0); if(res) return true; } } // 找不齐元素返回false return false; } // 回溯方法 public boolean search(int i,int j,int k){ // 字符数组的下标大于等于字符串长度,返回true if(k >= len) return true; // 当行坐标或列坐标越界,或字符数组当前状态不相等或二维数组中当前元素被访问过,返回false,属于剪枝 if(i < 0 || j < 0 || i >=n || j >= m || letters[k] != board[i][j] || visited[i][j]) return false; // 当前轮访问过的元素标记为true visited[i][j] = true; // 每个元素按上下左右四个方向回溯,记录结果的布尔值 boolean res = search(i + 1,j,k + 1) || search(i,j + 1,k + 1) || search(i - 1,j,k + 1) || search(i,j - 1,k + 1); // 当前元素的当前轮二维数组中所有元素遍历完后,将当前元素重新置为false,避免影响下一个元素在遍历数组时回溯时的检查 visited[i][j] = false; return res; } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)