題目描述
給定兩個單詞(beginword 和 endword)和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則:
每次轉換只能改變乙個字母。
轉換後得到的單詞必須是字典中的單詞。
說明:
示例 1:
輸入:
beginword = "hit",
endword = "cog",
wordlist = ["hot","dot","dog","lot","log","cog"]
輸出:[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
示例 2:
輸入:
beginword = "hit"
endword = "cog"
wordlist = ["hot","dot","dog","lot","log"]
輸出:
解釋: endword "cog" 不在字典中,所以不存在符合要求的轉換序列。
題解:
單詞接龍 的高階版本,儲存轉換路徑。
在 單詞接龍 中,我們已經通過bfs
找到最短路徑,下面就是根據最短路徑通過dfs
搜尋所有可能的路徑。
因為在bfs
中我們記錄了節點間的轉換次數關係,所以在爆搜的時候可以有效利用這個狀態,假設最小轉換次數為min_steps
,從s
開始進行搜尋,遍歷從s
出發點的相鄰節點e
,那麼可以進行剪枝:
時間複雜度:o(2
n∗n∗
l)
o(2^n*n*l)
o(2n∗n
∗l)
額外空間複雜度:o(n
2∗l)
o(n^2 * l)
o(n2∗l
)
class solution
s[i] = st[i];}}
for( const auto& it : lists )
s[i] = it[i];}}
}int bfs( const string& st, const string& ed ) }}
return dis[ed];
}void dfs( const string& ed, int min_steps )
for( const auto& it : g[s] ) }}
vector> findladders(string beginword, string endword, vector& wordlist)
};/*
記憶體:28.5mb,擊敗:52.58%
*/
126 單詞接龍 II
題目.high 這其實就是圖的演算法,dijkstra演算法 這道題,先求直達的最小路徑,這個用bfs沒啥好說的,一般求路徑的問題就是要用dfs,可是不需要求所有的到達路徑,也不需要求隨意的一條到達路徑,不然dfs準沒錯。所以我們還是要用bfs,不過在bfs的時候,把經過的所有節點都求出從開始到他這...
126 單詞接龍 II
給定兩個單詞 beginword 和 endword 和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回乙個空列表。所有單詞具有相...
126 單詞接龍 II
題目描述 給定兩個單詞 beginword 和 endword 和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換後得到的單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回乙個空列表。所有單詞...