九章演算法 拼多多面試題 單詞接龍 II

2021-10-18 21:40:43 字數 2950 閱讀 1371

描述

給出兩個單詞(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 小球排序

有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第乙個紅色停下,交換兩根指標所指顏色。重複上述過程。直到第二根指標找不到任何紅色。此時第一根指標到最後都是黃色或藍...