DFS深度优先搜索——LeetCode79. 单词搜索
Posted guomzh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DFS深度优先搜索——LeetCode79. 单词搜索相关的知识,希望对你有一定的参考价值。
题目:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
思路:
这是一道典型的dfs深搜题目,选定一个点,不断第深搜深度depth+1,知道得出结果就行了。步骤:
①把二维网格中的每一个点当作起点,进行dfs,如果结果为true直接返回,没有就继续把下一个点当为起点。
②深度优先搜索关键是: 递归 -> 判断是否为边界条件(递归结束情况) -> 遍历每种情况深度depth+1 -> 回溯
解答代码:
class Solution {
public boolean exist(char[][] board, String word) {
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(dfs(board, word, 0, i, j)){
return true;
}
}
}
return false;
}
public boolean dfs(char[][] board, String word, int index, int x, int y){
if(index == word.length()){
return true;
}
if(x < 0 || y < 0 || x == board.length || y == board[0].length){
return false;
}
char current = word.charAt(index);
if(board[x][y] != current){
return false;
}
//标记为已经遍历过
board[x][y] = '\0';
boolean result = dfs(board, word, index+1, x, y+1)
|| dfs(board, word, index+1, x, y-1)
|| dfs(board, word, index+1, x-1, y)
|| dfs(board, word, index+1, x+1, y);
//回溯
board[x][y] = current;
return result;
}
}
以上是关于DFS深度优先搜索——LeetCode79. 单词搜索的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 988:回溯和深度优先搜索(DFS)的区别
Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill)
Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles)
Leetcode之深度优先搜索(DFS)专题-DFS+记忆化 329. 矩阵中的最长递增路径(Longest Increasing Path in a Matrix)