每日刷題 單詞接龍II

2021-09-28 11:05:02 字數 1637 閱讀 3661

給定兩個單詞(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 的最短轉換序列。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換後得到的單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回乙個空列表。所有單詞...