題目描述
請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格子。例如,在下面的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
提示:
1 <= board.length <= 200
1 <= board[i].length <= 200
典型的深度優先搜索(DFS)
class Solution {
private:
int next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int len_y,len_x, len;
int temp;
public:
bool exist(vector<vector<char>>& board, string word) {
len_x = board.size();
len_y = board[0].size();
len = word.length();
if(len > len_x*len_y) return false;
for(int i = 0; i < len_x; i++){
for(int j = 0; j < len_y; j++){
if(word[0] == board[i][j]){
if(dfs(board, i, j, word, 1)){
return true;
}
}
}
}
return false;
}
bool dfs(vector<vector<char>>& board, int tx, int ty, string word, int step){
if(len == step) return true;
char t = board[tx][ty];
board[tx][ty] = '.';
for(int i = 0; i < 4; i++){
int x = tx + next[i][0];
int y = ty + next[i][1];
if(x < 0 || x >= len_x || y < 0 || y >= len_y || board[x][y] != word[step]){
continue;
}
if(dfs(board, x, y, word, step+1)) return true;
}
board[tx][ty] = t;
return false;
}
};
通過這個題,我學到了兩點:
- 分析題目情形,有的題需要回溯
- 標記路徑是否走過,可以將dfs函數的函數類型設計成bool類型,以前一直是單獨開一個二維數組進行記錄。這樣就不僅減少了標記初始化和執行的時間和空間,還減少了代碼量,對理解和閱讀又上了一個層次。