題目描述:
請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那么該路徑不能再次進入該格子。例如,在下面的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
解題思路:
對于尋找路徑問題,很容易想到廣度或者深度優先搜索,這道題采用深度優先搜索和回溯操作。
大致的思想為:對矩陣中的每一個位置進行深度優先搜索。為了保證對某一個位置搜索時路徑的不重復,需要對訪問過的位置進行標記(程序中將該位置賦值為’/’)。由于不同位置進行深度優先搜索時,會重復訪問某些位置,因此需要回溯操作,即在執行完某一位置的搜索后,將該標記了的位置的值賦值回其原來的值。
class Solution {
public:bool exist(vector<vector<char>>& board, string word) {for(int i = 0 ; i < board.size() ; ++i){for(int j = 0 ; j < board[0].size() ; ++j){if(dfs(board,i,j,word,0)) return true;}}return false;}bool dfs(vector<vector<char>>& board,int i, int j, string word ,int k){if(i>=board.size() || i<0 || j>=board[0].size() || j<0 || board[i][j] != word[k]) return false;if(k == word.size() - 1) return true;char temp = board[i][j];board[i][j] = ' ';bool res = dfs(board,i+1,j,word,k+1) || dfs(board,i-1,j,word,k+1) || dfs(board,i,j+1,word,k+1) || dfs(board,i,j-1,word,k+1);board[i][j] = temp;return res;}
};