前言
通过leetcode记录自己每天坚持刷题,以此监督自己的学习。不能放假了就懈怠😁
题目简介
题目传送地:剑指 Offer 12. 矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。
如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。
示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]],
word = “ABCCED” 输出:true
解析
这个题很明显了就是对每个点使用DFS搜到底看是否存在符合的”贪吃蛇“
并且要使用到回溯返回之前状态
代码
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
def check(i: int, j: int, k: int) -> bool:
if board[i][j] != word[k]:
return False
if k == len(word) - 1:
return True
visited.add((i, j))
result = False
for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)]:#DFS
newi, newj = i + di, j + dj
if 0 <= newi < len(board) and 0 <= newj < len(board[0]):
if (newi, newj) not in visited: #到过的点没必要深搜
if check(newi, newj, k + 1):
result = True
break
visited.remove((i, j)) #回溯
return result
h, w = len(board), len(board[0])
visited = set() # 存储到过的点,剪枝优化
for i in range(h):
for j in range(w):
if check(i, j, 0):
return True
return False