給定兩個單詞(beginword 和 endword)和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。
轉換需遵循如下規則:
每次轉換只能改變乙個字母。
轉換過程中的中間單詞必須是字典中的單詞。
說明:如果不存在這樣的轉換序列,返回乙個空列表。
所有單詞具有相同的長度。
所有單詞只由小寫字母組成。
字典中不存在重複的單詞。
你可以假設 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」 不在字典中,所以不存在符合要求的轉換序列。
廣度優先遍歷:對每乙個單詞的所有可能變化遍歷,並把符合的元素儲存在下一層中;
遍歷到的元素從字典中刪除:已經新增到搜尋佇列中的元素要從字典中刪除;
同層之間共享元素:同一層次中可能會出現子節點相同的情形,需要乙個結構儲存本層的元素;
用節點之間鏈結表示路徑:在乙個節點中儲存指向父節點的指標,乙個節點可能有多個父節點;
用遞迴來構造結果序列:dfs從endwrod節點遍歷到beginword節點構造結果陣列。
**:
class
solution
; unordered_set endw
;int flag1 =
0, flag2 =0;
//第乙個是否找到最短序列標誌, 第二個是否反轉標誌。
while
(!beginw.
empty()
)}}if
(flag1)
break
;//已經找到最短序列退出迴圈。
if(tmp.
size()
<= endw.
size()
) beginw = tmp;
else
} vector ans =
;dfs
(ans, beginword, endword)
;return res;
}void
dfs(vector
& ans, string& begin, string& end)
if(hash.
find
(begin)
== hash.
end())
return
;for
(auto str : hash[begin])}
};
126 單詞接龍 II
題目.high 這其實就是圖的演算法,dijkstra演算法 這道題,先求直達的最小路徑,這個用bfs沒啥好說的,一般求路徑的問題就是要用dfs,可是不需要求所有的到達路徑,也不需要求隨意的一條到達路徑,不然dfs準沒錯。所以我們還是要用bfs,不過在bfs的時候,把經過的所有節點都求出從開始到他這...
126 單詞接龍 II
給定兩個單詞 beginword 和 endword 和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回乙個空列表。所有單詞具有相...
126 單詞接龍 II
題目描述 給定兩個單詞 beginword 和 endword 和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換後得到的單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回乙個空列表。所有單詞...