描述
給出兩個單詞(start和end)和乙個字典,找出所有從start到end的最短轉換序列。
變換規則如下:
每次只能改變乙個字母。
變換過程中的中間單詞必須在字典**現。
樣例1
輸入:start = "a",end = "c",dict =["a","b","c"]
輸出:[["a","c"]]
解釋:
"a"->"c"
樣例2
輸入:start ="hit",end = "cog",dict =["hot","dot","dog","lot","log"]
輸出:[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]
解釋:
1."hit"->"hot"->"dot"->"dog"->"cog"
2."hit"->"hot"->"lot"->"log"->"cog"
從 end 到 start 做一次 bfs,並且把距離 end 的距離都儲存在 distance 中。 然後在從 start 到 end 做一次 dfs,每走一步必須確保離 end 的 distance 越來越近。
與另外乙個**中提前建立 index 不同,這裡是在尋找下乙個變換單詞的時候,再去獲得對應的單詞列表。乙個單詞最多有 l 個字元,每個字元有 25 種不同的變化(26個字母除掉這個位置上的字母),然後 check 一下在不在 dict 裡就知道是不是 next word 了。
from
collections
import
deque
class
solution
:"""
@param: start: a string
@param: end: a string
@param: dict: a set of string
@return: a list of lists of string
"""def
findladders
(self
,start
,end
,dict
):dict
.add
(start
)dict
.add
(end
)distance={}
self
.bfs
(end
,distance
,dict
)results=
self
.dfs
(start
,end
,distance
,dict,[
start
],results
)return
results
defbfs
(self
,start
,distance
,dict
):distance
[start]=
0queue
=deque
([start
])while
queue
:word
=queue
.popleft
()for
next_word
inself
.get_next_words
(word
,dict
):if
next_word
notin
distance
:distance
[next_word]=
distance
[word]+
1queue.(
next_word
)def
get_next_words
(self
,word
,dict
):words=
fori
inrange
(len
(word
)):forcin
'abcdefghijklmnopqrstuvwxyz':
next_word
=word[:i
]+c+
word[i
+1:]if
next_word
!=word
andnext_word
indict
:words.(
next_word
)return
words
defdfs
(self
,curt
,target
,distance
,dict
,path
,results
):if
curt
==target
:results.(
list
(path
))return
forword
inself
.get_next_words
(curt
,dict
):if
distance
[word]!=
distance
[curt]-
1:continue
path.(
word
)self
.dfs
(word
,target
,distance
,dict
,path
,results
)path
.pop
()
更多題解參考:九章演算法
九章演算法 拼多多面試題 和相同的二元子陣列
描述 在由若干 0 和 1 組成的陣列 a 中,有多少個和為 s 的非空子陣列。lintcode 領扣 樣例1 input a 1,0,1,0,1 s 2 output 4 explanation the 4 subarrays are bolded below 1,0,1 1,0,1 1,0,1,...
九章演算法 Google面試題 內積
描述 給定長度為n的a陣列,長度為k的b陣列 你可以從a陣列裡取k個數 規則如下 即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除 將取出的ai按取出的順序組成c陣列 求b與c的內積最大值 b與c內積為 i 0k 1bi ci 解釋1 a 1,4,3,2,5 b 1,2,3,4 ...
九章演算法面試題32 小球排序
有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第乙個紅色停下,交換兩根指標所指顏色。重複上述過程。直到第二根指標找不到任何紅色。此時第一根指標到最後都是黃色或藍...