目录

0079:单词搜索(★)

力扣第 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

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • boardword 仅由大小写英文字母组成

进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?

分析

典型的回溯法,依次找单词的每个字符即可。

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def dfs(i,j,k):
            if k==len(word):
                return True
            A = [(i+1,j),(i,j+1),(i-1,j),(i,j-1)] if k else product(range(m),range(n))
            for x,y in A:
                if 0<=x<m and 0<=y<n and board[x][y]==word[k]:
                    board[x][y] = '*'
                    if dfs(x,y,k+1):
                        return True
                    board[x][y]=word[k]
            return False
        m,n = len(board),len(board[0])
        return dfs(0,0,0)

3186 ms