java
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
输入 :二维字符数组,给定字符串
输出 :布尔值
思路:遍历字符数组,下上右左递归回溯
递归参数 : 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在 word 中的索引 k 。
终止条件 :
返回 false : (1) 行或列索引越界 或 (2) 当前矩阵元素与目标字符不同 或 (3) 当前矩阵元素已访问过 ( (3) 可合并至 (2) ) 。
返回 true : k = len(word) - 1 ,即字符串 word 已全部匹配。
递推工作 :
标记当前矩阵元素: 将 board[i][j] 修改为 空字符'\0' ,代表此元素已访问过,防止之后搜索时重复访问。
搜索下一单元格: 朝当前元素的 上、下、左、右 四个方向开启下层递归,使用 或 连接 (代表只需找到一条可行路径就直接返回,不再做后续 DFS ),并记录结果至 res 。
还原当前矩阵元素: 将 board[i][j] 元素还原至初始值,即 word[k]
java
class Solution {
public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
//字符数组长度
int x = board.length;
int y = board[0].length;
//遍历字符数组
for(int i = 0; i < x; i++){
for(int j = 0; j < y; j++){
if(backTrack(board, words, i, j, 0)){
return true;
}
}
}
return false;
}
public boolean backTrack(char[][] board, char[] words, int x, int y, int index){
//递归结束
//数组越界, 或者元素不符
if(x < 0 || y < 0 ||
x >= board.length ||
y >= board[0].length ||
board[x][y] != words[index]){
return false;
}
//遍历到words最后一个元素
if(index == words.length - 1){
return true;
}
//将现在的字符置为空,防止重复访问
board[x][y] = '\0';
//递归下上右左
boolean res = backTrack(board, words, x + 1, y, index + 1) ||
backTrack(board, words, x - 1, y, index + 1) ||
backTrack(board, words, x, y + 1, index + 1) ||
backTrack(board, words, x, y - 1, index + 1);
//还原
board[x][y] = words[index];
return res;
}
}