矩阵中的路径
Last updated
Last updated
问题简述
给定一个 m x n 二维字符矩阵 board 和字符串 word。如果 word 存在于网格中,返回 true ;否则,返回 false 。
其中单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
给定一个 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
示例 2:
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false
提示:
1 <= board.length <= 200
1 <= board[i].length <= 200
board 和 word 仅由大小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
棋盘搜索,非常典型的 DFS + 回溯问题;
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
if len(board) < 1:
return False
m, n = len(board), len(board[0])
# 使用内部函数,可以减少一些参数的传递,同时比成员方法更简洁
def dfs(i, j, k): # i, j, k 分别表示 board[i][j] 和 word[k]
if not 0 <= i < m or not 0 <= j < n: # 先判断是否越界
return False
if board[i][j] != word[k]: # 这一步可以合并到越界判断,但会损失一些可读性,故分离出来单独判断
return False
else: # board[i][j] == word[k]: # 如果当前位置字符相同,继续深度搜索
if k == len(word) - 1: # 如果字符已经全部匹配成功,返回 True
return True
# 置空,表示该位置已访问过;一些代码中会使用一个新的矩阵记录位置是否访问,这里直接在原矩阵上标记
board[i][j] = ''
# 继续遍历 4 个方向
flag = dfs(i + 1, j, k + 1) or dfs(i - 1, j, k + 1) or dfs(i, j + 1, k + 1) or dfs(i, j - 1, k + 1)
# 这一步是容易忽略的:因为需要回溯,所以必须还原该位置的元素
board[i][j] = word[k]
return flag
# board 中每一个位置都可能是起始位置,所以要循环遍历
for i in range(m):
for j in range(n):
if dfs(i, j, 0):
return True
return False