生活随笔
收集整理的這篇文章主要介紹了
LeetCode 126 单词接龙 II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
給定兩個單詞(beginWord 和 endWord)和一個字典 wordList,找出所有從
beginWord 到 endWord 的最短轉換序列。轉換需遵循如下規則:每次轉換只能改變一個字母。
轉換后得到的單詞必須是字典中的單詞。
說明
:如果不存在這樣的轉換序列,返回一個空列表。
所有單詞具有相同的長度。
所有單詞只由小寫字母組成。
字典中不存在重復的單詞。
你可以假設 beginWord 和 endWord 是非空的,且二者不相同。
題解
廣度優先搜索
代碼
class Solution
{
public
:void dfs(vector
<vector
<string
>> &res
,vector
<string
> tmp
,unordered_map
<string
,vector
<string
>>& next
,string beginWord
, string endWord
){if (beginWord
==endWord
){res
.push_back(tmp
);return ;}for (int i
=0;i
<next
[beginWord
].size();i
++){tmp
.push_back(next
[beginWord
][i
]);dfs(res
,tmp
,next
,next
[beginWord
][i
],endWord
);tmp
.pop_back();}}vector
<vector
<string
>> findLadders(string beginWord
, string endWord
, vector
<string
>& wordList
) {int length
=wordList
.size();if (!length
) return vector
<vector
<string
>>{};unordered_map
<string
,bool
> visited
;unordered_set
<string
> myset
;int n
=beginWord
.size();for (int i
=0;i
<wordList
.size();i
++) {visited
[wordList
[i
]]=false
;myset
.insert(wordList
[i
]);}queue
<string
> que
;que
.push(beginWord
);visited
[beginWord
]=true
;unordered_map
<string
,vector
<string
>> next
;unordered_map
<string
,bool
> inque
;inque
[beginWord
]=true
;vector
<string
> vec
;bool f
=false
; while (!que
.empty()){int cnt
=que
.size();while (cnt
--){string t
=que
.front(),k
;que
.pop();vec
.push_back(t
);for (int i
=0;i
<n
;i
++){k
=t
;for (int j
=0;j
<26;j
++){k
[i
]=j
+'a';if (myset
.find(k
)!=myset
.end()){if (k
==endWord
){next
[t
].push_back(k
);f
=true
;}else if (!visited
[k
]){if (!inque
[k
]) {que
.push(k
);inque
[k
]=true
;}next
[t
].push_back(k
);}}}}}for (int i
=0;i
<vec
.size();i
++){for (int j
=0;j
<next
[vec
[i
]].size();j
++) visited
[next
[vec
[i
]][j
]]=true
;}vec
.clear();if (f
) break;}vector
<vector
<string
>> res
;if (f
){vector
<string
> tmp
={beginWord
};dfs(res
,tmp
,next
,beginWord
,endWord
);}return res
;}
};
總結
以上是生活随笔為你收集整理的LeetCode 126 单词接龙 II的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。