矩陣中的路徑(Python and C++解法)
阿新 • • 發佈:2020-06-30
題目:
請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格子。例如,在下面的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]) orboard[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 };