劍指 Offer 12-矩陣中的路徑c++
一邊忙著複習物件導向一邊還堅持每日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):遞迴深度最多為字串的長度。
相關文章
- 《劍指offer》:[66]矩陣中的路徑矩陣
- 劍指offer:JZ12 矩陣中的路徑矩陣
- 力扣 - 劍指 Offer 12. 矩陣中的路徑力扣矩陣
- 用 Go 劍指 Offer 12. 矩陣中的路徑 (DFS + 回溯)Go矩陣
- 劍指offer面試題12:矩陣中的路徑(Java版已在牛客網AC)面試題矩陣Java
- 劍指 Offer 29-順時針列印矩陣c++矩陣C++
- 【劍指offer】順時針列印矩陣矩陣
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 劍指offer-19:順時針列印矩陣矩陣
- 【劍指offer】陣列中的逆序對陣列
- 矩陣中的路徑矩陣
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- 劍指offer——把陣列排成最小的數C++陣列C++
- 力扣 - 劍指 Offer 29. 順時針列印矩陣力扣矩陣
- 【劍指offer】二維陣列中的查詢陣列
- 劍指Offer-37-陣列中逆序對陣列
- 劍指 offer(1) -- 陣列篇陣列
- 劍指Offer--陣列中重複的數字陣列
- 【劍指offer】【1】二維陣列中的查詢陣列
- 《劍指offer》:[51]陣列中的重複數字陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 【劍指offer】二叉樹中和為某一值的路徑二叉樹
- 【劍指offer】把陣列排成最小的數陣列
- 劍指offer之順序列印陣列陣列
- 【劍指offer】調整陣列順序陣列
- JZ-065-矩陣中的路徑矩陣
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- 劍指offer——二叉樹的映象C++二叉樹C++
- 劍指offer——二叉樹的深度C++二叉樹C++
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 【劍指offer】連續子陣列的最大和陣列
- 【劍指offer】旋轉陣列的最小值陣列
- 【劍指offer】替換字串中的空格字串
- 劍指offer——正規表示式匹配C++C++