請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格子。例如,在下面的3×4的矩陣中包含一條字符串“bfce”的路徑。
[["a","b","c","e"],
["s","f","c","s"],
["a","d","e","e"]]但矩陣中不包含字符串“abfb”的路徑,因爲字符串的第一個字符b佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入這個格子。
示例 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
解題思路
採用深度有限搜索。從一個元素開始,按照上下左右的順序進行深度優先遍歷,成功則返回True;不成功則回溯至上一個節點。
剪枝。噹噹前路徑無法匹配成功時(如元素不同或該元素已經被訪問),則立刻返回,回溯至上一個節點。
代碼
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
self.board = board
self.word = word
for i in range(len(board)): # 按行
for j in range(len(board[0])):
if self.dfs(i,j,0):
return True
return False # 遍歷完後仍不能返回True,則返回False
def dfs(self, i,j,k): # 第i行第j列,是否匹配第k個字符
board = self.board
word = self.word
if not (0 <= i < len(board)) or not (0 <= j < len(board[0])) or (board[i][j] != word[k]): # 不匹配的情況
return False
# 匹配的情況
if k == len(word) - 1: # 如果k是最後一個字符,則返回True
return True
tmp, board[i][j] = board[i][j], '/' # 如果不是最後一個字符,有必要將這個字符暫時置爲'/',以防止重複
res = self.dfs(i+1,j,k+1) or self.dfs(i-1,j, k+1) or self.dfs(i, j+1, k+1) or self.dfs(i, j-1, k+1) # 對上下左右依次進行搜索
board[i][j] = tmp # 搜索完成後,將board[i][j]的值復原
return res
總結
1. Python可以使用 <=i<=這樣的判斷語句;
2. 二維list a和a[0]的含義.
3. 類中的函數f調用自身遞歸需要加上self.f