给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search
例:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
def helper(i, j, word, board, n): # 行;列;查找对象;被查找网格;长度
if n == len(word): # 在第一轮查询时n==0,所以当n==长度时说明已经查找完毕,返回True
return True
if 0 <= i < len(board) and 0 <= j < len(board[0]) and board[i][j] == word[n]: # 当选择的位置没有超过边界并且和查询对象对应相等时,设置为空,以免重复查找。
board[i][j] = ''
if helper(i-1, j, word, board, n+1) or helper(i+1, j, word, board, n+1) or helper(i, j-1, word, board, n+1) or helper(i, j+1, word, board, n+1): # 对四个方向进行遍历
return True
board[i][j] = word[n] # 遍历完后对刚刚设置为空的位置的值进行还原,不影响接下来的遍历
for i in range(len(board)): # 行遍历
for j in range(len(board[0])): # 列遍历
if helper(i, j, word, board, 0): # 每个元素都进行查检验
return True # 若存在返回值,则返回True
return False