给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。
同一个单元格内的字母不允许被重复使用。
示例:
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
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
def helper(board, mark, i, j, word):
if i < 0 or i >= len(board) or j < 0 or j>=len(board[0]): ## 边界条件判断
return False
if mark[i][j] is True: ## 访问标记判断
return False
if board[i][j] != word[0]: ## 判断字符匹配条件
return False
else:
if len(word) == 1: ## 结束递归判断
return True
else:
mark[i][j] = True ## 标记为已访问
result = helper(board, mark, i+1,j,word[1:]) or
helper(board, mark, i,j+1,word[1:]) or
helper(board, mark, i-1,j,word[1:]) or
helper(board, mark, i,j-1,word[1:])
mark[i][j] = False ## 恢复未访问标记
return result
mark = [[False for _ in range(len(board[0]))] for __ in range(len(board))]
for i in range(len(board)):
for j in range(len(board[0])):
result = helper(board,mark,i,j,word)
if result:
return True
return result