单词搜索(Word Search)

📌 定义

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

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

示例:
board = [
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

word = "ABCCED" → true
word = "SEE" → true
word = "ABCB" → false

核心思路

使用回溯 + DFS在网格中搜索单词:

  • 选择:从当前位置向四个方向探索
  • 约束:字符匹配且未访问过
  • 探索:递归搜索下一个字符
  • 撤销:标记为未访问,尝试其他路径
搜索"SEE"的过程:
S → E → E
↓   ↓   ↓
找S 找E 找E

复杂度分析

指标复杂度说明
时间复杂度O(m×n×4^L)L是单词长度
空间复杂度O(L)递归栈深度

Go 代码

Go 实现

func exist(board [][]byte, word string) bool {
    m, n := len(board), len(board[0])
 
    var backtrack func(i, j, k int) bool
    backtrack = func(i, j, k int) bool {
        if k == len(word) {
            return true
        }
 
        if i < 0 || i >= m || j < 0 || j >= n ||
           board[i][j] != word[k] {
            return false
        }
 
        temp := board[i][j]
        board[i][j] = '#'
 
        found := backtrack(i+1, j, k+1) ||
                backtrack(i-1, j, k+1) ||
                backtrack(i, j+1, k+1) ||
                backtrack(i, j-1, k+1)
 
        board[i][j] = temp
 
        return found
    }
 
    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            if backtrack(i, j, 0) {
                return true
            }
        }
    }
 
    return false
}

思路展开

搜索过程详解

board = [
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

搜索 "ABCCED":

从(0,0)开始:
A(0,0) → B(0,1) → C(0,2) → C(1,2) → E(2,2) → D(2,1)
✓ 找到完整路径

标记访问过程:
A → B → C → C → E → D
#   #   #   #   #   #

经典题目

LeetCode 问题

💡 优化技巧

相关主题


返回:回溯算法 | 算法学习导航