给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
分析
- python判断区间可以用一个表达式
- 可以通过改变原来的矩阵,减少外界空间占用
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
# 学习到了两点,python判断区间可以一个表达式
# 可以通过对原始矩阵改变然后在恢复来避免额外的空间占用
m, n = len(board), len(board[0])
word_n = len(word)
def backtrack(i, j, k):
# 一般可以在这里设置停止条件,最后一个条件也是剪枝
if not 0 <= i < m or not 0 <= j < n or board[i][j] != word[k]:
return False
if k == word_n - 1:
print(k)
return True
board[i][j], tmp = "/", board[i][j]
res = backtrack(i - 1, j, k + 1) or backtrack(i + 1, j, k + 1) or backtrack(i, j - 1, k + 1) or backtrack(i, j + 1, k + 1)
board[i][j] = tmp
return res
for i in range(m):
for j in range(n):
if backtrack(i, j, 0): return True
return False