《劍指offer》 面試題12. 矩陣中的路徑

題目描述

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

通過這個題,我學到了兩點:

  1. 分析題目情形,有的題需要回溯
  2. 標記路徑是否走過,可以將dfs函數的函數類型設計成bool類型,以前一直是單獨開一個二維數組進行記錄。這樣就不僅減少了標記初始化和執行的時間和空間,還減少了代碼量,對理解和閱讀又上了一個層次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章