Open songyy5517 opened 2 years ago
思路:回溯 & DFS & 剪枝
路径判断函数:回溯 & DFS & 剪枝
复杂度分析
class Solution {
public boolean exist(char[][] board, String word) {
// 思路:回溯问题,用DFS和剪枝解决
// 1. 异常处理
if (board == null || board[0].length == 0)
return false;
// 2. 遍历矩阵
for (int i = 0; i < board.length; i++){
for (int j = 0; j < board[0].length; j++){
if (checkPath(board, word, 0, i, j)){
return true;
}
}
}
return false;
}
boolean checkPath(char[][] board, String word, int path_len, int i, int j){
// 1. 递归出口
if (path_len == word.length())
return true;
// 剪枝
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || word.charAt(path_len) != board[i][j])
return false;
// 2. 将元素置为访问
board[i][j] = '\0';
// 3. DFS
boolean flag = checkPath(board, word, path_len+1, i-1, j) ||
checkPath(board, word, path_len+1, i+1, j) ||
checkPath(board, word, path_len+1, i, j-1) ||
checkPath(board, word, path_len+1, i, j+1);
// 3. 回溯
board[i][j] = word.charAt(path_len);
return flag;
}
}
2023/1/16
2023/9/14
2023/10/2
2023/11/7
2024/4/17
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。
示例 1:
示例 2:
分析 典型的回溯问题,可以考虑使用DFS & 剪枝解决。