【LeetCode 中等题】42-单词搜索

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

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

解法1。找字符串不一定要从头开始,所以设置一个双重嵌套for循环保证可以从任一个位置开始索引,设置一个等大小的矩阵存储标志位,在helper函数中首先设置好return False和True的条件,然后递归判断上下左右4个位置是否满足,递归返回上一层后记得把visited复位变成没有访问过。

别的做法思路相当,但事先判断更全面一些,比如增加判断word长度是否小于等于m*n,word里的字符board是否都有。

class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        if not board or not word:
            return False
        m = len(board)
        n = len(board[0])
        visited = [[0 for _ in range(n)] for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if self.helper(board, word, m, n, i, j, 0, visited):
                    return True
        return False
    
    def helper(self, board, word, m, n, i, j, k, visited):
        if i<0 or i>=m or j<0 or j>=n or board[i][j] != word[k] or visited[i][j] == 1:
            return False
        if k == len(word)-1:
            return True
        visited[i][j] = 1
        if self.helper(board,word, m, n, i-1,j,k+1,visited) or \
        self.helper(board,word, m, n, i,j-1,k+1,visited) or \
        self.helper(board,word, m, n, i+1,j,k+1,visited) or \
        self.helper(board,word, m, n, i,j+1,k+1,visited):
            return True
        visited[i][j] = 0
        return

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/85754551