回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。
回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
許多複雜的,規模較大的問題都可以使用回溯法,有「通用解題方法」的美稱。
若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜尋遍才結束。
而若使用回溯法求任乙個解時,只要搜尋到問題的乙個解就可以結束。
針對所給問題,確定問題的解空間:問題的解空間應該至少包含問題的乙個(最優)解
確定節點的擴充套件搜尋規則
以深度優先方式搜尋解空間,並在搜尋過程中利用剪枝函式避免無效搜尋。
遞迴函式的開頭寫好跳出條件,滿足條件才將當前結果加入總結果中(如果只是求是否有解,則直接返回結果即可。)
已經拿過的數不再拿 if(s.contains(num))
遍歷過當前節點後,為了回溯到上一步,要去掉已經加入到結果list中的當前節點。
/** *給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。
* * 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。
* * 示例:
* * board =
* [* ['a','b','c','e'],
* ['s','f','c','s'],
* ['a','d','e','e']
* ]* * 給定 word = "abcced", 返回 true.
* 給定 word = "see", 返回 true.
* 給定 word = "abcb", 返回 false.
*/public
class
wordsearch}}
return
false;}
public
static
boolean
dfs(
char
board,
boolean
visited,
int row,
int col,
int index,string word)
//當路徑行走到盡頭
if(row<
0||col<
0||row >= board.length||col>= board[0]
.length)
char ch = word.
charat
(index)
;//已經行走過的路徑不再走,當且僅當當前路徑未走過,且滿足條件時,才繼續if(
!visited[row]
[col]
&&ch==board[row]
[col]
)return
false;}
}
每日一題 單詞拼寫
給你乙份 詞彙表 字串陣列 words 和一張 字母表 字串 chars。假如你可以用 chars 中的 字母 字元 拼寫出 words 中的某個 單詞 字串 那麼我們就認為你掌握了這個單詞。注意 每次拼寫時,chars 中的每個字母都只能用一次。返回詞彙表 words 中你掌握的所有單詞的 長度之...
每日一題 拼寫單詞
給你乙份 詞彙表 字串陣列 words 和一張 字母表 字串 chars。假如你可以用 chars 中的 字母 字元 拼寫出 words 中的某個 單詞 字串 那麼我們就認為你掌握了這個單詞。注意 每次拼寫 指拼寫詞彙表中的乙個單詞 時,chars 中的每個字母都只能用一次。返回詞彙表 words ...
LeetCode每日一題 電話號碼 回溯演算法
輸入法九鍵,每個按鍵都代表著不用的字母,我們需要找到不同字影射,來進行不同序列的組成。如下是leetcode第十七題。給定乙個僅包含數字 2 9 的字串,返回所有它能表示的字母組合。給出數字到字母的對映如下 與 按鍵相同 注意 1 不對應任何字母。示例 輸入 23 輸出 ad ae af bd be...