LeetCode题解No79——“单词搜索”
LeetCode题解
No79
难度:Middle
题目描述:
/*
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
题目思路
看到这个题目最开始理解错了题目的意思,理解成了判断char[][] board里面是否存在足够的字符满足word的需求,写了一遍用HashMap存键值对再取出作比较的答案,发现跑不过,看了题解才知道本题是要用DFS,查找char[][] board里是否有那么一条通路,可以组成word。用DFS那套模板就比较简单。首先需要注意,首先是需要一个boolean[][] vis去维护board里的元素有没有被走过,其次是判定递归的结束条件,还有在走不通这个点的时候需要进行回溯处理。在写代码的时候注意这三点即可。
代码执行
public static boolean Solution(char[][] board,String word){
// 使用DFS来对题目进行求解
int m = board.length;
int n = board[0].length;
boolean[][] vis = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
boolean flag = dfs(board,vis,i,j,0,word);
if (flag){
return true;
}
}
}
return false;
}
/**
*
* @param board char[][]矩阵
* @param vis 用于判断是否走过此元素
* @param x 新的一个x坐标
* @param y 新的一个y坐标
* @param k Word中第k个元素
* @param word 需要查找的字符串
*/
public static boolean dfs(char[][] board,boolean[][] vis,int x,int y, int k,String word){
// 递归退出条件
if (board[x][y] != word.charAt(k)){
return false;
}else if (k == word.length() - 1){
return true;
}
// 表明当前该元素被走过
vis[x][y] = true;
// 搜索方向
int[][] directions = {{0,1},{1,0},{0,-1},{-1,0}};
// 结果
boolean result = false;
for (int[] dic :
directions) {
// 边界判断
int newX = x + dic[0];
int newY = y + dic[1];
if (newX >= 0 && newX < board.length && newY >= 0 && newY < board[0].length){
if (!vis[newX][newY]){
boolean flag = dfs(board,vis,newX,newY,k+1,word);
if (flag){
result = true;
break;
}
}
}
}
// 回溯,所以将vis[x][y]重置为false
vis[x][y] = false;
return result;
}
纠错
1:第一次做题时没有理解清楚题意
2:在写的时候没有注意边界,一直报错