給定兩個單詞(beginword 和 endword)和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則:
每次轉換只能改變乙個字母。
轉換過程中的中間單詞必須是字典中的單詞。
說明:如果不存在這樣的轉換序列,返回 0。
所有單詞具有相同的長度。
所有單詞只由小寫字母組成。
字典中不存在重複的單詞。
你可以假設 beginword 和 endword 是非空的,且二者不相同。
示例 1:
輸入:beginword = 「hit」,
endword = 「cog」,
wordlist = [「hot」,「dot」,「dog」,「lot」,「log」,「cog」]
輸出: 5
解釋: 乙個最短轉換序列是 「hit」 -> 「hot」 -> 「dot」 -> 「dog」 -> 「cog」,
返回它的長度 5。
示例 2:
輸入:beginword = 「hit」
endword = 「cog」
wordlist = [「hot」,「dot」,「dog」,「lot」,「log」]
輸出: 0
解釋: endword 「cog」 不在字典中,所以無法進行轉換。
主要方法是利用佇列實現廣度優先搜尋。找到字典裡和當前單詞相差乙個字母的單詞入隊,然後遍歷這幾個單詞,直到找到endword。
先構造乙個字串佇列,並將beginword加入佇列。
對佇列頭字串做單個字元替換每次替換後,判斷是否和endword匹配,如果匹配,返回res,沒有匹配,看一下字典裡有沒有這個單詞。
如果有,則將該字串加入佇列,同時將該字串從字典裡刪除。
重複,直到和endword匹配。如果最後隊列為空還未匹配到,則返回0.
如果直接在wordlist中查詢的話,會超時。set中找乙個單詞的時間複雜度是o(log(n)),比list快。
class
solution
:def
ladderlength
(self, beginword:
str, endword:
str, wordlist: list[
str])-
>
int:
if endword not
in wordlist:
return
0 queue =
[beginword]
res =
1 wordlist =
set(wordlist)
while queue:
for a in
range
(len
(queue)):
curstr = queue.pop(0)
curstrlen =
len(curstr)
for i in
range
(curstrlen)
:for x in
range
(ord
('a'),
ord(
'z')+1
):# 將二十六個英文本母分別和當前字串的某乙個字母來替換
temp = curstr[
:i]+
chr(x)
+ curstr[i+1:
]if temp == endword and temp in wordlist:
return res +
1elif temp != endword and temp in wordlist:
wordlist.remove(temp)
res +=
1return
0
1018 單詞接龍
題目描述 description 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beast...
1220 單詞接龍
題目 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分...
zufeoj 單詞接龍
單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存...