单词变换(去哪儿2017春招真题)
题目描述
有一个单词列表,一个初始单词和一个最终单词,初始单词需要通过单词列表逐步变换到最终单词,求变换所需的最短变换路径长度。
变换规则:每次只能变动1个字母(不可交换位置,如:从abc变成cba属于变动了2个字母),每次变换只能从单词列表中选取。
例如:初始单词hot,最终单词dog,单词列表[got, dot, god, dog, lot, log],最短变换路径为[hot,dot,dog],最短变换路径长度为3。
注:单词列表中包含最终单词,不包含初始单词;列表中每一项单词长度与初始单词、最终单词相同;列表中单词不重复;所有字母均为小写。
输入
输入数据有三行,第一行为初始单词;第二行为最终单词;第三行为单词列表,单词和单词之间以空格分割。
| 样例输入
hot dog got dot god dog lot log
|
输出
最短变换路径长度。
| 样例输出
3
|
时间限制C/C++语言:1000MS其它语言:3000MS | 内存限制C/C++语言:65536KB其它语言:589824KB |
这道题比较经典,使用模板的BFS写法,字符串每次改变一个字母比较的写法也非常有技巧,另外这道题目的输入输出的处理也比较难
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
unordered_set<string> dict(wordList.begin(),wordList.end());
if(!dict.count(endWord)) return 0; // 如果字典不包含结束词, 那么不能转换
queue<string> q;
q.push(beginWord);
int steps = 1;
while(!q.empty()){
steps++;
for(int size=q.size()-1;size>=0;size--){
string w=q.front();
q.pop();
for(int i=0;i<w.size();i++){
char c=w[i];
for(int j='a';j<='z';j++){
w[i]=j;
if(w==endWord){
return steps;
}
if(dict.count(w)){
dict.erase(w);
q.push(w);
}
}
w[i]=c;
}
}
}
return 0;
}
};