79 單詞搜尋(dfs)

2021-10-05 04:48:15 字數 2561 閱讀 6613

1. 問題描述:

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。

示例:board =

[['a','b','c','e'],

['s','f','c','s'],

['a','d','e','e']

]給定 word = "abcced", 返回 true

給定 word = "see", 返回 true

給定 word = "abcb", 返回 false

board 和 word 中只包含大寫和小寫英文本母。

1 <= board.length <= 200

1 <= board[i].length <= 200

1 <= word.length <= 10^3

2. 思路分析:

① 這道題目是經典的路徑嘗試問題,與之前的從左上角到右下角走迷宮的問題一樣這種嘗試可能性的問題最好的辦法是使用dfs來解決的,我們需要先遍歷二維陣列board找到給出的單詞中的第乙個字母,因為只有當第乙個字母符合要求的時候遞迴往下才有意義,找到單詞中的第乙個字母之後進行遞迴,在二維陣列中從四個方向看一下能否找到滿足條件的單詞,只要是找到乙個那麼就直接返回true了,由於是上下左右四個方向所以對應著四個平行狀態,對於這種經典的走路徑或者是迷宮問題我們可以宣告乙個二維陣列或者是兩個一位陣列來表示四個方向,這樣就可以在for迴圈中對四個方向進行遞迴,一開始的時候只是嘗試以單詞中的第乙個字母往下進行遞迴到遞迴出口的時候判斷長度是否相等,並且兩個字串是否相等,這個是沒有經過任何的優化的,所以會嘗試所有與單詞長度相等的單詞等到最後才判斷兩個字串是否相等,這樣提交上去肯定是超時了,因為在遞迴的時候會搜尋一些並不符合的答案,而這些答案在搜尋的過程中就出現了不符合的字母所以完全不必要搜尋下去了

② 於是我們可以對其進行優化,在往下遞迴之前先判斷當前得到的記錄字串是否是給出單詞的字首,假如不是那麼不用遞迴下去了,否則才遞迴下去,而且在新增當前的字元的時候記錄字串的長度需要小於給出的單詞長度,這樣剪枝之後可以減少一些不必要的搜尋,經過優化之後提交上去就通過了,我們可以先將這些遞迴的**寫出來再結合具體的情況進行優化

下面是判斷遞迴前判斷已經形成的記錄字串是否是給出單詞的字首:

③ 我們還可以對其進行優化,我們可以在上面的**中多傳入乙個引數用來記錄遞迴的下乙個狀態中給出單詞的字母是什麼,這其實也好理解,比如給出的單詞是see,第乙個字母為s,往下進行遞迴所以下乙個字母為e,在遞迴的時候從上下左右四個方向搜尋是e的字母,假如發現有e的字母才遞迴下去,假如不是e說明肯定不符合要求了,這個優化比上面的方法好一點更加減少了不必要的搜尋,同時當這個引數到達了給出單詞的字串的長度的時候說明二維陣列中存在了這個單詞返回true即可,只需要修改上面的**一點點就可以完成(增加乙個表示下乙個遞迴狀態中對於給出單詞字母的位置,遞迴出口只需要判斷出位置到達了給出單詞的長度即可)

④ 因為圖中對應四個方向的搜尋所以我們在搜尋的時候需要對之前遍歷過的地方進行標記,因為每乙個位置都會向四個方向搜尋,假如不標記的話會造成重複搜尋乙個位置造成棧溢位了,這裡可以使用乙個二維陣列來標記,並且在遞迴一開始的地方就對其標記即可,並且我們在遞迴呼叫結束之後進行回溯,因為嘗試完了當前的狀態回溯之後將之前的狀態清楚就可以嘗試下乙個狀態了

⑤ 對於這種走路徑的**其實不難理解,我們乙個很直白的思路是我在當前的位置下往四個方向走,對於每乙個位置都是一樣的所以需要使用遞迴來解決,其中的關鍵是要把握其中的細節,遞迴的整體的**框架都是類似的,特別是對於四個方向的搜尋更是差不多的,直接在for迴圈中進行遞迴並且處理一些邊界、遞迴出口與優化即可

3. **如下:

優化一:

class solution }}

return false;

}int dx = ;

int dy = ;

private boolean dfs(int row, int col, char board, string word, int r, int c, string cur) }}

return false;}}

優化二:

class solution }}

return false;

}/*除了使用給出的第一種方法之外還可以對其進行優化*/

int dx = ;

int dy = ;

private boolean dfs(int row, int col, char board, string word, int r, int c, string cur, int pos) }}

return false;}}

79 單詞搜尋(dfs 回溯)

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。board a b c e s f c s a d e e 給定 word abcced 返回 tru...

力扣 79單詞搜尋(dfs)

題目描述 給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcce...

LeetCode 79 單詞搜尋 DFS

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced 返回 ...