LeetCode79 单词搜索

43 阅读1分钟

leetcode.cn/problems/wo…

image.png

解法一:DFS

这个题的思路类似岛屿问题,线性扫描整个二维数据,然后从单词首个字符开始匹配,如果和当前单元格匹配,就深度优先搜索,递归判断上下左右的相邻单元格是否继续匹配单词下个字符。同时,为了避免同个单元格内的字符被重复使用,我们需要对访问过的单元格做一下标记

func exist(board [][]byte, word string) bool {
    var found bool
    for i:=0; i<len(board); i++{
        for j:=0; j<len(board[0]); j++{
            dfs(board, i, j, word, 0, &found)
            if found{ // 找到一个答案就可以
                return true
            }
        }
    }
    return false
}

func dfs(board [][]byte, i, j int, word string, idx int, found *bool){
    if idx == len(word) { // base case 1: 整个word已经匹配完,找到一个答案
        *found = true
        return
    }
    if *found { // base case 2: 已经找到了一个答案,不用再搜索了
        return
    }
    // 在递归进行上下左右搜索是,判断索引是否越界
    if i < 0 || j < 0 || i >= len(board) || j >= len(board[0]){ 
        return
    }
    // 搜索到某个字符不匹配时直接结束这条搜索路径
    if board[i][j] != word[idx]{
        return
    }
    // 当前字符匹配成功
    // 已经匹配过的字符,先修改一下,避免重复使用
    ori := board[i][j]
    board[i][j] = '.'
    // word[idx] 被 board[i][j] 匹配,开始向四周搜索 word[idx+1..]
    dfs(board, i+1, j, word, idx+1, found)
    dfs(board, i-1, j, word, idx+1, found)
    dfs(board, i, j+1, word, idx+1, found)
    dfs(board, i, j-1, word, idx+1, found)
    // 回溯,恢复当前字符
    board[i][j] = ori
}