要求
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true
示例 3:
输入: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
重点问题
解题思路:
我们使用一个标记列表,标记列表主要是用于同一个单元格内的字母不允许被重复使用,然后后面进行word的检测,wd[0] != matrix[row][col]
,进行判定是不同直接放弃,过了就说明是相同的,当word的长度是1,说明完全匹配,不用走下面的过程,要不然,在标记列表中进行标记,然后搜索上下左右的邻居,同样递归检查,即可。