题目如图片所示。这种题需要用到回溯法(等会开个算法专栏,系统学习一下),主要是要设定好减枝条件和返回条件。
这道题采用了深度优先方法,代码如下:
class Solution {
public boolean exist(char[][] board, String word) {
if (board == null || word.length() < 1 || word == null) return false;
char[] target = word.toCharArray();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (dfs(board, target, i, j, 0)) return true;
}
}
return false;
}
private boolean dfs(char[][] board, char[] word, int i, int j, int k) {//i,j为当前元素在矩阵中的下标,k为此时检查对应word中的第几个元素
//先定义减枝条件
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != word[k] || k >= word.length) return false;
//定义最终找到完整路径的返回条件
if (k == word.length - 1) return true;
//将此时的位置标记为已访问
char tmp = board[i][j];
board[i][j] = '/';
//继续向下查找路径
boolean ans = dfs(board, word, i, j - 1, k + 1) || dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i - 1, j, k + 1) || dfs(board, word, i + 1, j, k + 1);
board[i][j] = tmp;
return ans;
}
}
加上我第二次自己写的代码:
class Solution {
String myWord;
char[] required;
public boolean exist(char[][] board, String word) {
myWord = word;
if (board == null || board.length < 1 || word == null || word.length() < 1) return false;
required = word.toCharArray();
boolean[][] isVisted = new boolean[board.length][board[0].length];
LinkedList<Character> check = new LinkedList<>();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (recur(board, isVisted, i, j, check, 0)) return true;
}
}
return false;
}
private boolean recur(char[][] board, boolean[][] isVisted, int i, int j, LinkedList<Character> check, int k) {
//设置返回条件
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || isVisted[i][j] || board[i][j] != required[k]) return false;
check.add(required[k]);
if (check.size() == required.length) return true;
//将当前字符设置为已访问
isVisted[i][j] = true;
boolean ans = recur(board, isVisted, i + 1, j, check, k + 1) || recur(board, isVisted, i - 1, j, check, k + 1) || recur(board, isVisted, i, j + 1, check, k + 1) || recur(board, isVisted, i, j - 1, check, k + 1);
isVisted[i][j] = false;
check.removeLast();
return ans;
}
}