题目:
思路:
一般遇到路径搜索问题,基本上都是 DFS 深度优先遍历和回溯 方向
这题可以建立一个递归的模型
- 递归出口是 递归的深度 等于 单词 的长度
- 递归二维数组的时候需要判断边界条件和是否已经遍历过该位置,或者是该位置的字符不等于word对应遍历深度的字符
- 以顺时针的方向去遍历相邻的位置
- 只要存在一种方向遍历返回了true,就说明存在一条路径,那么就可以直接返回true
- 要注意标记遍历过的位置
Java语言题解:
class Solution {
boolean[][] flag;
char[][] board_0;
int row;
int col;
public boolean exist(char[][] board, String word) {
row = board.length;
col = board[0].length;
board_0 = board;
flag = new boolean[row][col];
for(int i = 0;i<row;i++){
for(int j = 0;j<col;j++){
if(dfs(i,j,word,0)){
return true;
}
}
}
return false;
}
public boolean dfs(int i,int j,String word,int dx){
if(dx == word.length()) return true;
if(!checkBoard(i,j) || flag[i][j] || word.charAt(dx)!=board_0[i][j]) return false;
flag[i][j] = true;
boolean f0 = dfs(i-1,j,word,dx+1);
boolean f1 = dfs(i,j+1,word,dx+1);
boolean f2 = dfs(i+1,j,word,dx+1);
boolean f3 = dfs(i,j-1,word,dx+1);
if(f0 || f1 || f2 || f3) return true;
flag[i][j] = false;
return false;
}
public boolean checkBoard(int i,int j){
if(i>=row||i<0) return false;
if(j>=col||j<0) return false;
return true;
}
}
一些注意事项
//获取二维数组的行高度
int row = board.length;
//获取二维数组的列高度;
int col = board[0].length;