面試題12 矩陣中的路徑(路徑搜索) Python3

請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格子。例如,在下面的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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章