funcexist(board [][]byte, word string)bool { // 获取 board 数组的长宽 n, m = len(board), len(board[0]) // 初始化方向数组 dx, dy = []int{-1, 0, 0, 1}, []int{0, -1, 1, 0} // 依次枚举网格中的每个位置 for i := 0; i < n; i++ { for j := 0; j < m; j++ { // 如果找到和字符串第一个字符 word[0] 匹配的位置 (i, j),则从当前位置进行搜索 if board[i][j] == word[0] { // 初始化一个标记数组,用于标记 DFS 搜索过程中,已经搜索过的点 st := make([][]bool, n) for k := range st { st[k] = make([]bool, m) } // 如果从当前位置找到了答案,则说明可以在网格中找到给定的字符串,返回 true if dfs(board, word, 0, i, j, st) { returntrue } } } } // 如果全部可能的位置都寻找了一遍,均没有找到,则返回 false returnfalse }
var n, m int var dx, dy []int
// board:题目给定的网格。word:题目给定需要寻找的字符串 // u: 表示当前已经从 board 网格找到 word 字符串的前 u 个字符了 // x, y: 表示当前在 board 网格中的位置 // st: 标记数组 funcdfs(board [][]byte, word string, u, x, y int, st [][]bool)bool { // 如果 u 到 word 的最后一个字符了,说明所有字符都找到了,说明在网格中找到字符串 word 了,返回 true if u == len(word) - 1 { returntrue } // 搜索过的点标记为 true,避免再次搜索 st[x][y] = true // 利用枚举方向数组来实现枚举周围 4 个方向 for i := 0; i < 4; i++ { // 利用方向数组计算下一个搜索的位置 (a, b) a, b := x + dx[i], y + dy[i] // 如果搜索的位置超过网格边界,则跳过 if a < 0 || b < 0 || a >= n || b >= m { continue } // 如果搜索的位置已经被标记了(说明搜索过了),或者搜索的位置不和当前字符串对应位置 (word[u + 1]) 匹配,则跳过 if st[a][b] || board[a][b] != word[u + 1] { continue } // 合法,则搜索 (a, b) 位置,如果我们从这个方向搜索,可以匹配,则返回 true if dfs(board, word, u + 1, a, b, st) { returntrue } } // 回溯:将标记过的点清除标记 st[x][y] = false // 如果从当前位置开始向周围 4 个方向搜索,均找不到字符串 word,则返回 false returnfalse }
classSolution { public: constint dx[4] = {-1, 0, 0, 1}; constint dy[4] = {0, -1, 1, 0}; int n, m;
booldfs(vector<vector<char>>& board, string word, int u, int x, int y, vector<vector<bool>>& st){ if (u == word.size() - 1) returntrue; st[x][y] = true; for (int i = 0; i < 4; ++i) { int a = x + dx[i], b = y + dy[i]; if (a < 0 || b < 0 || a >= n || b >= m) continue; if (st[a][b] || board[a][b] != word[u + 1]) continue; if (dfs(board, word, u + 1, a, b, st)) returntrue; } st[x][y] = false; returnfalse; }
boolexist(vector<vector<char>>& board, string word){ n = board.size(), m = board[0].size(); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (board[i][j] == word[0]) { vector<vector<bool>> st(n, vector<bool>(m)); if (dfs(board, word, 0, i, j, st)) returntrue; } } } returnfalse; } };