1. 程式人生 > 實用技巧 >矩陣中的路徑(Python and C++解法)

矩陣中的路徑(Python and C++解法)

題目:

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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof

思路:

  採用回溯法,即DFS。當搜尋到某一點之後,不考慮邊界條件的情況下,其有上下左右四個方向繼續遞迴搜尋,但由於搜尋過的點不能被再次搜尋,實際上只有三個方向可以繼續遞迴。

  最壞的情況下,每個點都要遍歷三條遞迴路徑的全部字串,所以時間複雜度是3^k * i*j,且最壞情況下空間複雜度為k。

  搜尋終止條件:行或列索引越界或 當前矩陣元素(包括已經被標記為'\'的元素)與目標字元不同。

Python解法:

 1 class Solution:
 2     def exist(self, board: List[List[str]], word: str) -> bool:
 3         def dfs(i, j, k):
 4             if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or
board[i][j] != word[k]: # 搜尋終止條件 5 return False 6 if k == len(word) - 1: # 搜尋成功條件 7 return True 8 9 temp = board[i][j] # 暫存當前搜尋點 10 board[i][j] = '!' # 標記已經被搜尋 11 res = 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) 12 board[i][j] = temp # 還原矩陣元素,以備下一輪搜尋使用 13 return res 14 15 # 由於矩陣中可能存在重複的元素,因此每個元素都可能是起始點 16 for i in range(len(board)): 17 for j in range(len(board[0])): 18 if dfs(i, j, 0): 19 return True 20 return False

C++解法:

 1 class Solution {
 2 public:
 3     bool exist(vector<vector<char>>& board, string word) {
 4         for(int m = 0; m < board.size(); m++)
 5             for(int n = 0; n < board[0].size(); n++)
 6                 if(dfs(board, word, m, n, 0))
 7                     return true;
 8         return false;
 9 
10 
11     }
12     bool dfs(vector<vector<char>> &b, string &w, int i, int j, int k) {
13         if(i < 0 || i >= b.size() || j < 0 || j >= b[0].size() || b[i][j] != w[k])
14         return false;
15         // 不可以按照python的寫法:if(!(0 <= i < b.size()) || !(0 <= j < b[0].size()) || b[i][j] != w[k])
16         if(w.size()-1 == k)
17             return true;
18 
19         char temp = b[i][j];
20         b[i][j] = '!';
21         bool res = dfs(b,w,i+1,j,k+1) || dfs(b,w,i-1,j,k+1) || dfs(b,w,i,j+1,k+1) || dfs(b,w,i,j-1,k+1);
22         b[i][j] = temp;
23         return res;
24     }
25 };