【回溯】79. 单词搜索

79. 单词搜索

解题思路

  • 遍历起点: 使用两层循环遍历整个二维字符数组 board,以每个点作为起点进行搜索。

  • 深度优先搜索(DFS): 在 dfs 方法中,使用递归进行深度优先搜索。在搜索的过程中,考虑四个方向(上、下、左、右)是否有匹配的字符。

  • 递归终止条件:

  • 如果当前坐标越界(超出数组范围)或者当前坐标字符与目标字符不匹配,则返回 false,表示搜索失败。

  • 如果当前搜索的字符序列 k 达到了目标字符串的末尾,说明已经找到了匹配的路径,返回 true。

  • 标记访问过的字符: 为了避免重复访问同一个字符,可以在访问过的位置设置一个标记,这里使用 ‘\0’ 来表示标记。

  • 回溯: 在每一次递归调用后,需要恢复原始的字符,即将标记过的字符重新还原成原始的字符,以便进行下一次搜索。

class Solution {
    public boolean exist(char[][] board, String word) {
        char[] words = word.toCharArray();

        for(int i = 0; i < board.length; i++){
            for(int j = 0; j < board[0].length; j++){
                if(dfs(board,words, i,j, 0)){
                    return true;
                }
            }
        }

        return false;
    }


    boolean dfs(char[][] board,char[] word,int i,int j,int k){
        if(i >= board.length || i < 0|| j >= board[0].length || j < 0 || board[i][j] != word[k]){
            return false;
        }

        if(k == word.length - 1){
            return true;
        }

        board[i][j] = '\0';

        boolean res = dfs(board,word, i+1,j, k+ 1) || dfs(board,word, i-1,j, k+ 1)
        || dfs(board,word, i,j+1, k+ 1)||dfs(board,word, i,j - 1, k+ 1);

        board[i][j] = word[k];

        return res;


    }
}

你可能感兴趣的:(#,Leetcode,数据结构,算法)