力扣第126題單詞接龍II,bfs

2021-10-08 07:58:10 字數 2274 閱讀 8539

單詞接龍 ii

給定兩個單詞(beginword 和 endword)和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則:

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

轉換後得到的單詞必須是字典中的單詞。

說明:

如果不存在這樣的轉換序列,返回乙個空列表。

所有單詞具有相同的長度。

所有單詞只由小寫字母組成。

字典中不存在重複的單詞。

你可以假設 beginword 和 endword 是非空的,且二者不相同。

示例 1:

輸入:beginword = 「hit」,

endword = 「cog」,

wordlist = [「hot」,「dot」,「dog」,「lot」,「log」,「cog」]

輸出:[

[「hit」,「hot」,「dot」,「dog」,「cog」],

[「hit」,「hot」,「lot」,「log」,「cog」]

]示例 2:

輸入:beginword = 「hit」

endword = 「cog」

wordlist = [「hot」,「dot」,「dog」,「lot」,「log」]

輸出:

解釋: endword 「cog」 不在字典中,所以不存在符合要求的轉換序列。

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

思路是:

bfs,難點在於如何儲存路徑,在於如何建圖,思路在**的注釋中

class

solution

//beginword可能不在wordlist,不在的話,就新增進去if(

!set.

count

(beginword)

)//鄰接表表示圖,初始化大小

g.resize

(wordlist.

size()

);//如果endword不在陣列裡面就結束了

if(wordlist.

size()

==0||!set.

count

(endword)

)//每個單詞的長度

int wordlen = beginword.

length()

;//用來判斷是否被訪問過

unordered_mapbool

> visited;

//雜湊表對映,用string,對映除在陣列中的下標

unordered_mapint> pos;

for(

int i =

0; i < wordlist.

size()

; i++

) visited[beginword]

=true

;//用bfs遍歷圖需要佇列,佇列中儲存的是路徑

queue> q;

//第一條路徑

vectorpath;

path.

push_back

(beginword)

; q.

push

(path)

;int flag =0;

/*我們需要再每一層都遍歷完,再把遍歷過的結點標誌為true,

如果遍歷乙個結點就標誌,可能這一層有幾個結點,都與下一層同乙個結點相連.如果標誌了,那麼就只新增了一條路徑,

必須在這一層遍歷完之後,再把所有下一層的結點標誌為true,下一層的結點儲存在visit中*/

vector visit;

while

(!q.

empty()

)elseif(

!visited[s])}

}//吧下一層的結點標誌為訪問

for(

int i =

0; i < visit.

size()

; i++)}

return res;

}void

isconnected

(int cur ,vector

& wordlist)

} wordlist[cur]

[i]= origin;}}

};intmain()

力扣127 單詞接龍

參考文章 雙向bfs為什麼比單項bfs快,這裡我們把雙向分為前向和後向,在最壞複雜度下,隨著傳遞的推進,前向傳遞會越來越複雜,速度越來越慢,這時我們根據有用資訊或者叫先驗 有先驗幹嘛不用,這裡指endword 來降低前向傳遞的複雜程度,所以可以縮短前向的匹配的時間,從而實現整體優化的效果。舉個不一定...

力扣 127 單詞接龍

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

力扣每日一題 單詞接龍

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