410 字
2 分钟
LeetCode-79. 单词搜索
2026-04-02

回溯#

79. 单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。


示例 1:

img
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCCED"
输出:true

示例 2:

img
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "SEE"
输出:true

示例 3:

img
输入: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-单词搜索/
作者
sheep44044
发布于
2026-04-02
许可协议
CC BY-NC-SA 4.0