leetcode_79 单词搜索

57 阅读1分钟

要求

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:

image.png

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

image.png

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:

image.png

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board 和 word 仅由大小写英文字母组成

核心代码

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        marked = [[0 for col in row] for row in board]
        for i in range(len(board)):
            for j in range(len(board[i])):
                if self.emit(board,marked,word,i,j):
                    return True
        return False

    def emit(self,matrix,trace,wd,row,col):
        if wd[0] != matrix[row][col]:
            return False
        if len(wd) == 1:
            return True
        trace[row][col] = 1
        for d in [[0,1],[0,-1],[1,0],[-1,0]]:
            x = row + d[0]
            y = col + d[1]
            if 0 <= x < len(matrix) and 0 <= y < len(matrix[0]):
                if not trace[x][y] and self.emit(matrix,trace,wd[1:],x,y):
                    return True
        trace[row][col] = 0
        return False

image.png

重点问题

解题思路:

我们使用一个标记列表,标记列表主要是用于同一个单元格内的字母不允许被重复使用,然后后面进行word的检测,wd[0] != matrix[row][col],进行判定是不同直接放弃,过了就说明是相同的,当word的长度是1,说明完全匹配,不用走下面的过程,要不然,在标记列表中进行标记,然后搜索上下左右的邻居,同样递归检查,即可。