題目:
鏈接:劍指 Offer 12. 矩陣中的路徑;LeetCode 79. 單詞搜索
難度:中等
給定一個 m x n 二維字符網(wǎng)格 board 和一個字符串單詞 word 。如果 word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。
例如,在下面的 3×4 的矩陣中包含單詞 “ABCCED”(單詞中的字母已標出)。
示例 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
提示:
- m == board.length
- n = board[i].length
- 1 <= m, n <= 6
- 1 <= word.length <= 15
- board 和 word 僅由大小寫英文字母組成
深度優(yōu)先搜索:
簡單的深搜。從單詞的首字符開始在網(wǎng)格上逐字符逐方向的深搜,dfs 函數(shù)傳遞的參數(shù)是當前網(wǎng)格中搜索的位置和當前單詞中搜索的字符位置,單詞全部匹配完成或者深搜所有路徑都已搜索過即為完成。有一個visited數(shù)組記錄訪問過的位置、避免字符重復使用。
詳細請看代碼注釋。
代碼:
class Solution {
public:
string Word; // 查找的單詞
int len; // 單詞長度
vector<vector<char>> Board; // 網(wǎng)格
int m, n; // m * n 的網(wǎng)格
vector<vector<bool>> visited; // 單元格是否已被訪問
bool dfs(int i, int j, int k) { // i,j 為當前網(wǎng)格位置,k為當前查找的word字符位置
if(i < 0 || i >= m || j < 0 || j >= n) return false; // 邊界判斷
if(visited[i][j]) return false; // 字符不可重復使用
if(Board[i][j] == Word[k]) { // 當前字符匹配成功
visited[i][j] = true;
if(k == len - 1) return true; // 查找到單詞終點,返回成功
else {
if(dfs(i - 1, j, k + 1)) return true; // 沒查找完成,繼續(xù)在當前位上下左右四個方向查找下一個字符
if(dfs(i + 1, j, k + 1)) return true;
if(dfs(i, j - 1, k + 1)) return true;
if(dfs(i, j + 1, k + 1)) return true;
visited[i][j] = false; // 下一字符匹配失敗,釋放當前訪問位
}
}
return false; // 當前字符不匹配,或下一字符所有方向上都匹配失敗,返回失敗
}
bool exist(vector<vector<char>>& board, string word) {
Board = board;
m = board.size(), n = board[0].size();
Word = word;
len = word.size();
visited.resize(m, vector<bool>(n, false)); // 訪問數(shù)組初始化
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
bool flag;
if(board[i][j] == word[0]) flag = dfs(i, j, 0); // 從單詞第一個字符開始搜索
if(flag) return true;
}
}
return false;
}
};
時間復雜度:一個非常寬松的上界為O(M * N * 3L),其中M,N為網(wǎng)格的長度與寬度,L為字符串word的長度。在每次調用函數(shù)dfs時,除了第一次可以進入4個分支以外,其余時間我們最多會進入3個分支(因為每個位置只能使用一次,所以走過來的分支沒法走回去)。由于單詞長為L,故dfs(i, j, 0)的時間復雜度為O(3L),而我們要執(zhí)行O(M * N)次檢查。然而,由于剪枝的存在,我們在遇到不匹配或已訪問的字符時會提前退出,終止遞歸流程。因此,實際的時間復雜度會遠遠小于Θ(M * N * 3L)。文章來源:http://www.zghlxwxcb.cn/news/detail-432378.html
空間復雜度:O(M * N)。我們額外開辟了O(M * N)的visited數(shù)組,同時棧的深度最大為O(min(L, M * N))。文章來源地址http://www.zghlxwxcb.cn/news/detail-432378.html
到了這里,關于劍指 Offer 12. 矩陣中的路徑 / LeetCode 79. 單詞搜索(深度優(yōu)先搜索)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!