難度:中等給定兩個單詞(標籤:雙向bfs
beginword
和endword
)和乙個字典,找到從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" 不在字典中,所以無法進行轉換。
對於本題來說,從beginword
到endword
與從endword
到beginword
最終得到的結果是一樣的,可以分別從兩端構造乙個樹,樹的結點是轉換過程中的中間節點,然後利用bfs進行搜尋,找到最短路徑長度,也就是樹的最小高度。對於bfs來說,複雜度與樹的每一層的結點數量相關,為了加速查詢,可以採取兩端搜尋的方法來進行優化,也就是說一端從beginword
到endword
進行查詢,另一端從endword
到endword
進行查詢,每次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。所有單詞具有相同的長度。所有單詞只由...