劍指 Offer 12-矩陣中的路徑c++

小pig飼養員發表於2020-11-19

一邊忙著複習物件導向一邊還堅持每日LeetCode,修仙到現在。
甚至迷糊到二維字串的下標小於零導致的報錯都找了半天…

題目描述

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

很明顯就是使用深度優先遍歷來做,要點一:不符合單詞的字母直接剪枝 要點二:在遞迴之前把對應位置的字串變成沒有意義的字元,遞迴結束後再變回來。
ps:中途犯了很蠢的錯誤,在判斷是否越界之前定義了char tmp=map[i][j]…

class Solution {
public:
    string word;
    bool exist(vector<vector<char>>& board, string word) {
        if (word.empty()||board.empty() || board[0].empty()) 
            return word.empty();
            rows=board.size();//有多少個一維陣列,即行
            cols=board[0].size();//一維陣列中有多少個元素,即列
            for(int i=0;i<rows;i++)
                for(int j=0;j<cols;j++)
                    if(board[i][j]==word[0])
                        if(dfs(board,word,i,j,0))
                        return true;
            return false;
                    
    }
private:
    int rows,cols;
    bool dfs(vector<vector<char>>& map, string word, int i, int j, int dis) 
    {
        if(i>=rows||i<0||j>=cols||j<0||map[i][j]!= word[dis]) 
            return false;
        if(dis==word.size()-1)
            return true;
        char tmp=map[i][j];
        map[i][j]='\0';//防止返回當前點
        bool jdg=dfs(map,word,i+1,j,dis+1)||dfs(map,word,i-1,j,dis+1)||dfs(map,word,i,j+1,dis+1)||dfs(map,word,i,j-1,dis+1);
        map[i][j]=tmp;
        return jdg; 
    }
};

在這裡插入圖片描述
時間複雜度,太困了,沒腦子想
先借用Krahets大佬的解釋:在這裡插入圖片描述
設字串長度為K
空間複雜度O(K):遞迴深度最多為字串的長度。

相關文章