LeetCode 79. 单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。
同一个单元格内的字母不允许被重复使用。

示例:
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
posted @ 2020-07-12 10:37  机器狗mo  阅读(96)  评论(0编辑  收藏  举报