[LeetCode]79 单词搜索

题目描述

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

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

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution:
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
def check(board, word):
d = collections.defaultdict(int)
m, n = len(board), len(board[0])
for i in range(m):
for j in range(n):
d[board[i][j]] += 1
for c in word:
if c not in d or d[c] <= 0:
return False
d[c] -= 1
return True

def dfs(board, i, j, word):
c = board[i][j]
board[i][j] = '*'
m, n = len(board), len(board[0])
if not word:
return True
for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
if i+di < 0 or i+di >= m or j+dj < 0 or j+dj >= n:
continue
if board[i+di][j+dj] == word[0] and dfs(board, i+di, j+dj, word[1:]):
return True
board[i][j] = c
return False
if not word:
return True
if not board or not board[0]:
return False
if not check(board, word):
return False
last = word[1:]
m, n = len(board), len(board[0])
for i in range(m):
for j in range(n):
if board[i][j] == word[0] and dfs(board, i, j, last):
return True
return False