410 字
2 分钟
LeetCode-79. 单词搜索
回溯
给定一个
m x n二维字符网格board和一个字符串单词word。如果word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
![]()
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCCED"输出:true示例 2:
![]()
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "SEE"输出:true示例 3:
![]()
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCB"输出:false
思路
感觉这道题是 200. 岛屿数量 的进阶版,难点就是如何处理四个方向的递归?
这里就给backtrack引入了一个bool返回值,这段代码found := backtrack(row-1, col, index+1) || backtrack(row+1, col, index+1) || backtrack(row, col-1, index+1) || backtrack(row, col+1, index+1)是点精之笔
并且这里对数据的存储和处理也是比较有意思的,board[row][col] = '#',不需要引入额外的数组,就可以避开这个数
func exist(board [][]byte, word string) bool { m, n := len(board), len(board[0])
var backtrack func(row, col, index int) bool backtrack = func(row, col, index int) bool { if index == len(word) { return true }
if row < 0 || col < 0 || row >= m || col >= n || board[row][col] != word[index] { return false }
temp := board[row][col] board[row][col] = '#'
found := backtrack(row-1, col, index+1) || backtrack(row+1, col, index+1) || backtrack(row, col-1, index+1) || backtrack(row, col+1, index+1)
board[row][col] = temp return found }
for i := 0; i < m; i++ { for j := 0; j < n; j++ { if board[i][j] == word[0] { if backtrack(i, j, 0) { return true } } } } return false} LeetCode-79. 单词搜索
https://sheep44044.github.io/posts/算法/回溯/leetcode-79-单词搜索/