在问 · 算法题解

79. 单词搜索

题目描述

输入一个 m x n 的字符网格 board 和一个字符串 word。

从某个格子出发,每一步移到上下左右相邻的格子,依次经过的字母若恰好拼出 word,就说 word 在网格中。同一条路径里一个格子最多用一次。

能拼出时返回 true,否则返回 false。

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

解释:沿 A→B→C→C→E→D 走,可以拼出。

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

解释:从第 1 行末尾的 S 出发,向下走到 E,再向左到 E。

示例 3
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]]
word = "ABCB"
输出:false

解释:拼到 ABC 之后要回到已用过的 B,不允许。

数据范围

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board 和 word 只含大小写英文字母。

进阶:若网格更大,能否用剪枝加快搜索?

解题思路

DFS 匹配并临时标记格子。

为什么正确

当前路径内格子不可重复。

复杂度分析

时间 O(mn·3^L),额外空间 O(L)。

易错点

注意边界条件并在回溯或弹出后恢复状态。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
 def exist(self,b,w):
  m,n=len(b),len(b[0])
  def f(r,c,k):
   if k==len(w):return True
   if not(0<=r<m and 0<=c<n) or b[r][c]!=w[k]:return False
   z=b[r][c];b[r][c]='#';ok=any(f(r+dr,c+dc,k+1) for dr,dc in((1,0),(-1,0),(0,1),(0,-1)));b[r][c]=z;return ok
  return any(f(r,c,0) for r in range(m) for c in range(n))

载入编辑器,自己跑一遍 →

回溯 专题的其他题目

查看 回溯 全部题目 →