跳到主要内容

79. 单词搜索 [medium]

79. 单词搜索 [medium]

https://leetcode-cn.com/problems/word-search/

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

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

示例:

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

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

提示:

  • board 和 word 中只包含大写和小写英文字母。
  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200
  • 1 <= word.length <= 10^3

通过次数73,177 | 提交次数173,574

First Try

2020-07-29

class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
# 其实如果要多次使用,较快的方法肯定还是对矩形的所有可能构建trie树
# 既然是一次性的,那就还是backtrack来一波吧
if not (len(board) and len(board[0]) and len(word)):
return False

m, n = len(board), len(board[0])

def backtrack(i, j, fidx, visited):
if fidx == len(word):
return True
for si, sj in [(0, 1), (0, -1), (-1, 0), (1, 0)]:
nsi, nsj = i + si, j + sj
if 0 <= nsi < m and 0 <= nsj < n \
and (nsi, nsj) not in visited \
and board[nsi][nsj] == word[fidx]:
visited.add((nsi, nsj))
if backtrack(nsi, nsj, fidx + 1, visited):
return True
visited.remove((nsi, nsj))
return False

for i in range(m):
for j in range(n):
if board[i][j] == word[0]:
if backtrack(i, j, 1, set([(i, j)])):
return True
return False
  • 执行用时:352 ms, 在所有 Python3 提交中击败了15.65%的用户
  • 内存消耗:14.7 MB, 在所有 Python3 提交中击败了11.11%的用户