單詞接龍 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。所有單詞具有相同的長度。所有單詞只由...