解法一: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
}