127 單詞接龍

2021-10-10 13:32:35 字數 2108 閱讀 7442

難度:中等

標籤:雙向bfs

給定兩個單詞(beginwordendword)和乙個字典,找到從beginwordendword的最短轉換序列的長度。轉換需遵循如下規則:

每次轉換只能改變乙個字母。

轉換過程中的中間單詞必須是字典中的單詞。

說明:示例 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" 不在字典中,所以無法進行轉換。

對於本題來說,從beginwordendword與從endwordbeginword最終得到的結果是一樣的,可以分別從兩端構造乙個樹,樹的結點是轉換過程中的中間節點,然後利用bfs進行搜尋,找到最短路徑長度,也就是樹的最小高度。對於bfs來說,複雜度與樹的每一層的結點數量相關,為了加速查詢,可以採取兩端搜尋的方法來進行優化,也就是說一端從beginwordendword進行查詢,另一端從endwordendword進行查詢,每次bfs遍歷中間結點個數少的那一端。

舉個例子:

class

solution

:def

ladderlength

(self, beginword:

str, endword:

str, wordlist: list[

str])-

>

int:

if endword not

in wordlist:

return

0

l =len(endword)

ws =

set(wordlist)

head =

tail =

tmp =

list

('abcdefghijklmnopqrstuvwxyz'

) res =

1while head:

iflen

(head)

>

len(tail)

: head, tail = tail, head

q =set(

)for cur in head:

for i in

range

(l):

for j in tmp:

word = cur[

:i]+ j + cur[i+1:

]if word in tail:

return res +

1if word in ws:

q.add(word)

ws.remove(word)

head = q

res +=

1return

0

對於乙個bfs問題來說,一般都具備幾個要素:

需要有邊界條件:邊界條件可能為迷宮的牆壁和邊緣,也可能為題目中給出的不可用的資料

有已訪問陣列:當前位置未被訪問是能夠入佇列的必要條件

可能有前驅節點:用於需要輸出路徑時新增

需要佇列來儲存當前層的節點

雙向bfs核心技巧:使用兩個佇列進行bfs,每次只遍歷佇列較短的一側

127 單詞接龍

思路和126差不多,區別在於只用bfs,每次訪問一層,用乙個map來儲存訪問過的結點以及與起點的距離,避免重複訪問。最後輸出map中的終點項即可 import queue class solution def ladderlength self,beginword,endword,wordlist ...

127 單詞接龍

給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 示例 1 輸入 beginword hit endword cog wo...

127 單詞接龍

給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回 0。所有單詞具有相同的長度。所有單詞只由...