题目要求需要在网格中的相邻单元格内按顺序找到给定单词的字母。在单词中相邻的字母需要也需要在网格中相邻,因此可以采用DFS来对网格进行搜索。
使用一个辅助二维数组来记录网格中某个元素是否已经被访问,而且当搜索到某一地方发现不满足要求时,需要返回上一层搜索并取消该元素被访问的标记,即回溯。
class Solution {
int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
public boolean exist(char[][] board, String word) {
int m = board.length;
int n = board[0].length;
boolean[][] visited = new boolean[m][n];
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(dfs(board, visited, word, i, j, 0, m, n))return true;
}
}
return false;
}
public boolean dfs(char[][] board, boolean[][] visited, String word, int i, int j, int index, int m, int n){
if(index == word.length()-1){
return word.charAt(index) == board[i][j];
}
if(board[i][j] == word.charAt(index)){
visited[i][j] = true;
for(int k=0; k<4; k++){
int x = i+dir[k][0];
int y = j+dir[k][1];
if(inArea(x, y, m, n) && !visited[x][y]){
if(dfs(board, visited, word, x, y, index+1, m, n))return true;
}
}
//回溯
visited[i][j] = false;
}
return false;
}
public boolean inArea(int x, int y, int m, int n){
return x>=0 && y>=0 && x < m && y< n;
}
}