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 length 5.
Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
看了网上的思路:
BFS,改变某个位置的字母然后再查找,同时用2个queue分别记录步数和当前单词,每次的pop和push都同步。
int ladderLength(string start, string end, unordered_set<string> &dict) {
if (start==end) {
return 1;
}
queue<string> nodes;//使用queue容器
queue<int> depth;
nodes.push(start);//start入队列
depth.push(1);//1入队
findItem(start, dict);//查看是否存在于字典中
while (nodes.size()>0) {//遍历每一个单词
string cur=nodes.front();//访问队首元素
nodes.pop();//队列的第一个元素出队列
int dep=depth.front();//步数初始为1
depth.pop();
for (int i=0; i<cur.size(); i++) {//改变单词的字母
for (int j=0; j<26; j++) {//26个英文字母
if (cur[i]!='a'+j) {
string temp=cur;
temp[i]='a'+j;
if (temp==end) {
return dep+1;//可以转换为end,需要dep+1步
}
if (findItem(temp, dict)) {
nodes.push(temp);
depth.push(dep+1);
}
}
}
}
}
return 0;
}
bool findItem(string ts,unordered_set<string> &dict){
unordered_set<string>::const_iterator ci=dict.find(ts);
if (ci!=dict.end()) {
dict.erase(ci);
return true;
}else{
return false;
}
return true;
}