leeetoe 單詞接龍(python)

2021-09-24 07:31:17 字數 1925 閱讀 2577

給定兩個單詞(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,另外相鄰的兩部分不能存...