題目描述:
給定兩個單詞(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」 不在字典中,所以不存在符合要求的轉換序列。
方法1:
主要思路:
(1)最短路徑,可以考慮使用廣度優先搜尋,剩下的就是建圖;
(2)將鄰接的雙向圖,則遍歷給出的字典,將可以相鄰轉換的字串使用對應的索引建立鄰接圖,這裡需要定義乙個判斷兩個字串是否是可以相互轉換的函式;
(3)在建立鄰接圖前,先對字典進行判斷,主要判斷兩點,乙個是是否包含終止字串,若不包含,則直接返回空結果,另乙個是是否包含開始字串,若不包含,則需要將開始字串插入到字典中;
class
solution
}return diff==1;
} vector>
findladders
(string beginword, string endword, vector
& wordlist)
else
if(end_id==-1
&&endword==wordlist[i])}
//若終止字串不存在字典中,則直接返回空結果
if(end_id==-1
);}//若起始字串不存在字典中,則將起始字串插入到字典中
if(begin_id==-1
)//建立鄰接圖
vectorint>>
edges
(wordlist.
size()
);//對字典中的字串進行兩兩判斷
for(
int i=
0;isize()
;++i)}}
vector>res;
//儲存結果
queueint>> q;
//廣度優先的佇列
vector<
int>
costs
(wordlist.
size()
,int_max)
;//用於判斷當前的轉換路徑能否插入到佇列中的輔助陣列
q.push
(vector<
int>(1
,begin_id));
//初始化,從起始字串開始
costs[begin_id]=0
;//初始化
while
(!q.
empty()
)//將轉換路徑壓入到結果
res.
push_back
(tmp);}
else}}
}return res;
//返回結果}}
;
126 單詞接龍 II
題目.high 這其實就是圖的演算法,dijkstra演算法 這道題,先求直達的最小路徑,這個用bfs沒啥好說的,一般求路徑的問題就是要用dfs,可是不需要求所有的到達路徑,也不需要求隨意的一條到達路徑,不然dfs準沒錯。所以我們還是要用bfs,不過在bfs的時候,把經過的所有節點都求出從開始到他這...
126 單詞接龍 II
給定兩個單詞 beginword 和 endword 和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回乙個空列表。所有單詞具有相...
126 單詞接龍 II
題目描述 給定兩個單詞 beginword 和 endword 和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換後得到的單詞必須是字典中的單詞。說明 示例 1 輸入 beginword hit end...