Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
Only one letter can be changed at a time
Each intermediate word must exist in the dictionary
For example,
Given:
start =”hit”
end =”cog”
dict =[“hot”,”dot”,”dog”,”lot”,”log”]
As one shortest transformation is”hit” -> “hot” -> “dot” -> “dog” -> “cog”,
return its length5.
Note:
Return 0 if there is no such transformation sequence.
All words have the same length.
All words contain only lowercase alphabetic characters.
题意:给定一个起始字符串和一个目标字符串,将起始字符串按照指定的变换规则转换为目标字符串,求最少要进行多少次转换。
转换规则:每次只能改变字符串中的一个字符,且每次转换后的字符串都要在给定的字符串集合中。
注意点:
- 如果无法完成转换则返回0
- 所有给出的字符串的长度都相等
- 所有的字符都为小写字母
class Solution{
public:
int ladderLength(string start, string end, unordered_set<string> &dict){
if (start == end)
return 0;
queue<pair<string, int>> q;
map<string, bool> m;
vector<string> v;
q.push(make_pair(start, 1));
while (!q.empty()){
pair<string, int> cur = q.front();
string word = cur.first;
int lev = cur.second;
if (word == end)
break;
q.pop();
v.clear();
getWord(v, word, m, dict);
int len = v.size();
for (int i = 0; i < len; ++i)
{
q.push(make_pair(v[i], lev + 1));
}
}
if (q.empty())
return 0;
else
return q.front().second;
}
void getWord(vector<string> &v, string start, map<string, bool> &m, const unordered_set<string> &dict)
{
int size = start.size();
for (int i = 0; i < size; ++i){
string tmp(start);
for (int j = 0; j < 26; ++j){
tmp[i] = j + 'a';
if (tmp != start && dict.find(tmp) != dict.end() && m.find(tmp)==m.end())
{
m.insert(make_pair(tmp, false));
v.push_back(tmp);
}
}
}
}
};