題目:
給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。
示例:board =
[[『a』,『b』,『c』,『e』],
[『s』,『f』,『c』,『s』],
[『a』,『d』,『e』,『e』]
]給定 word = 「abcced」, 返回 true
給定 word = 「see」, 返回 true
給定 word = 「abcb」, 返回 false
題解:
class
solution
// 最後乙個字母也相等,返回成功
if(board[i]
[j]==word[index]
&&index==word.
size()
-1)//不可重複用同一元素,因此用0掩蓋這一位置
board[i]
[j]=
'0';
//回溯if(
backtrack
(board,word,i-
1,j,index+1)
)elseif(
backtrack
(board,word,i+
1,j,index+1)
)elseif(
backtrack
(board,word,i,j-
1,index+1)
)elseif(
backtrack
(board,word,i,j+
1,index+1)
)// 如果不通,回溯至上乙個狀態
board[i]
[j]=word[index]
;return
false;}
bool
exist
(vectorchar
>>
& board, string word)}}
return result;}}
;
官方題解:
class
solution
// 最後乙個字母也相等,返回成功
if(board[i]
[j]==word[index]
&&index==word.
size()
-1)//不可重複用同一元素,因此用0掩蓋這一位置
board[i]
[j]=
'0';
//回溯if(
backtrack
(board,word,i-
1,j,index+1)
||backtrack
(board,word,i+
1,j,index+1)
||backtrack
(board,word,i,j-
1,index+1)
||backtrack
(board,word,i,j+
1,index+1)
)// 如果不通,回溯至上乙個狀態
board[i]
[j]=word[index]
;return
false;}
bool
exist
(vectorchar
>>
& board, string word)}}
return result;}}
;
暴力搜尋 回溯法
回溯法 backtracking 是深度優先搜尋 dfs 的一種,按照深度優先的順序便利解答樹。應用範圍很廣,只要能把待求解的問題分成不太多的步驟,每個步驟又只有不太多的選擇,都可以考慮應用回溯法。在學習回溯法之前,一定要保證遞迴程式能熟練準確地寫出。當把問題分成若干步驟並遞迴求解時,如果當前步驟沒...
LeetCode 79 單詞搜尋(回溯DFS)
給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced 返回 ...
回溯法遵循深度優先嗎 深度優先搜尋(回溯法)
事實上,深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次.舉例說明之 下圖是乙個無向圖,如果我們從a點發起深度優先搜尋 以下的訪問次序並不是唯一的,第二個點既可以是b也可以是c...