链接:LintCode 炼码
class Solution {
public:
/**
* @param start: a string
* @param end: a string
* @param dict: a set of string
* @return: An integer
*/
int ladderLength(string &start, string &end, unordered_set<string> &dict) {
// write your code here
std::queue<std::string> que;
que.push(start);
std::unordered_map<std::string, int> distance;
//distance.insert(std::string(start), 0);
distance[start] = 1;
dict.insert(end);
auto get_next = [](std::string& f)->std::vector<std::string> {
std::string front(f);
std::vector<std::string> result;
for (int i = 0; i < front.size(); ++i) {
char tmp = front[i];
for (char ch = 'a'; ch <= 'z'; ++ch) {
if (tmp == ch) {
continue;
}
front[i] = ch;
result.push_back(front);
}
front[i] = tmp;
}
return result;
};
while (!que.empty()) {
auto f = que.front();
que.pop();
for (auto neighboard : get_next(f)) {
if (dict.find(neighboard) == dict.end()) {
continue;
}
//cout << "neigh=" << neighboard << " ";
if (distance.find(neighboard) != distance.end()) {
continue;
}
if (neighboard == end) {
return distance[f]+1;
}
distance[neighboard] = distance[f]+1;
que.push(neighboard);
}
//cout << endl;
}
return -1;
}
};
题解: