概述
题目地址
思路
- 首先 题目要求寻找最短转换序列,那么我们容易想到使用BFS
BFS思路这里不再介绍
- 沿着BFS考虑代码编写,问题在于如何正确保存获取目标单词的路径,有以下问题:
- BFS利用队列,每次遍历一个level,获得的是每层可以访问的结点,并不是我们需要的路径
- 所以,BFS每次获得合法结点时,应该保存该结点及到达该结点的路径(即之前访问的结点序列)
- 但是注意的是,BFS每次遍历一层,可能会导致有多条路径出现
- 那么在遍历下一层时,应该对上一层产生的每条路径都需要分析才行
分析
代码
class Solution {
public:
vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {
vector<vector<string>> last_res;
unordered_map<string,int> search;
for(auto s : wordList)
search[s] = 1;
queue<vector<string>> res;
res.push({beginWord});
int found = 0;
while(!res.empty()) {
int size_path = res.size();
unordered_set<string> visited_temp;
for (int i = size_path; i > 0; --i) {
auto path = res.front(); res.pop();
string path_last = path.back();
for (int j = 0; j < path_last.size(); ++j) {
char temp = path_last[j];
for (char c = 'a'; c <= 'z'; ++c){
if (temp == c) continue;
path_last[j] = c;
if (!search[path_last]) continue;
visited_temp.emplace(path_last);
path.push_back(path_last);
if(path_last == endWord){
found = 1;
last_res.push_back(path);
} else
res.push(path);
path.pop_back();
}
path_last[j] = temp;
}
}
for (auto &p : visited_temp)
search[p] = 0;
if (found) break;
}
return last_res;
}
};
|