给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
思路:
DFS搜索 + 回溯。
注意由于测试数据很大,使用python语言一定要善用剪枝节省时间。
比如下面这一行如果不加最后的判断条件,就会超时…………
if 0<= x < m and 0<= y < n and visited[x][y] == 0 and not self.res: #not self.res很关键,剪枝非常重要
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
if not board or not board[0] or not len(word):
return False
m, n = len(board), len(board[0])
if len(word) > m *n:
return False
self.res = False
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
visited = [[0 for _ in range(n + 1)] for j in range(m + 1)]
def dfs(start, x0, y0):
if start >= len(word) or board[x0][y0] != word[start]: #找不到解
return
visited[x0][y0] = 1
if board[x0][y0] == word[start]:
if start == len(word) - 1: #找到一个可行解啦!!!
self.res = True
return
else:
for k in range(4):
x = x0 + dx[k]
y = y0 + dy[k]
if 0<= x < m and 0<= y < n and visited[x][y] == 0 and not self.res: #not self.res很关键,剪枝非常重要
dfs(start + 1, x, y) #找下一个字母
visited[x0][y0] = 0 #回溯
for i in range(m):
for j in range(n):
if board[i][j] == word[0]:
dfs(0, i, j) #开始搜索
if self.res:
return self.res
return self.res
下面写于2019.6.18
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
if not board or not board[0]:
return False
if not word:
return True
self.res = False
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def dfs(start, x0, y0):
if start == len(word) - 1:
self.res = True
return
visited.add((x0, y0))
for k in range(4):
x = x0 + dx[k]
y = y0 + dy[k]
# print x, y
if 0 <= x < m and 0 <= y < n and (x, y) not in visited and board[x][y] == word[start + 1] and not self.res:
visited.add((x, y))
dfs(start + 1, x, y)
visited.remove((x, y))
m, n = len(board), len(board[0])
# print m * n, len(word)
for i in range(m):
for j in range(n):
if board[i][j] == word[0]:
visited = set()
dfs(0, i, j)
if self.res:
return True
return False