文章目录
题目描述
题解思路
我们遍历对矩阵中的每个点,对每个点采用深度优先搜索,检查是否能以当前点做为开头来匹配word
我们使用一个与矩阵相同规格的二维数组表示矩阵中对应的点是否被访问过,防止重复计算
题解代码
go
func exist(board [][]byte, word string) bool {
m, n := len(board), len(board[0])
// 表示矩阵中i, j位置是否在一次搜索word的过程中被访问过
used := make([][]bool, m)
for i := 0; i < m; i++ {
used[i] = make([]bool, n)
}
// 当前要匹配word哪一个字符的下标
idx := 0
var dfs func(i, j int) bool
dfs = func(i, j int) bool {
// word所有字符已经找到
if idx == len(word) {
return true
}
// 越界、已经被访问过、当前矩阵中的字符不是word需要匹配的字符,这些情况表示从当前字符开始无法找到word[idx:]这个字符串
if i < 0 || j < 0 || i >= m || j >= n || used[i][j] || board[i][j] != word[idx] {
return false
}
// 继续搜索word[idx + 1:]
idx++
used[i][j] = true
if dfs(i, j + 1) || dfs(i, j - 1) || dfs(i + 1, j) || dfs(i - 1, j) {
return true
}
used[i][j] = false
idx--
return false
}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if dfs(i, j) {
return true
}
}
}
return false
}