原题: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.
这个题就是求从start 变化到end 共需要多少步骤,基本思想采用bfs,主要步骤如下:
1 建立一个queue,用来保存处理过的string,最开始start入队,
这个queue其实保存的是这个bfs的层次(KEY),如图1
图1
2 每次队queue的头进行判断,如果这个头变化一个字母在字典中能够找到,把这个变化后的单词入列
3 用step保存层次的信息,当找到某一个单词==end时,返回step+1,如图2
图2
这个题主要是保存层次这个信息比较麻烦,我是这么处理的,用两个int分别保存这一层和下一层的个数,最开始的thisLevelNum=1,然后只有和本层的单词差一个字母的单词才能入队,同时下一层的nextLevelNum++,每次对队列进行pop操作时,一定是对本层的进行操作,因此,thisLevelNum--,让这个数为0时,说明队列的头就已经是下一层了,把nextLevelNum的值赋给thisLevelNum,同时nextLevelNum由于是新的一层,赋为0
代码(604ms):
class Solution {
public:
int ladderLength(string start, string end, unordered_set<string> &dict) {
//利用bsf,保存现在已经查看的string
queue<string> q;
//vector<int>levle;
int step = 1;
//levle.push_back(1);
int thisLevelNum = 1;
int nextLevelNum = 0;
q.push(start);
while(!q.empty()){
string current = q.front();
q.pop();
for (int i = 0 ;i < current.length() ;i++){
string temp = current;
temp[i] = 'a';
while(temp[i]<='z'){
if(dict.find(temp) != dict.end()){
if(temp == end){
return step+1;
}
q.push(temp);
dict.erase(temp);
nextLevelNum++;
}
temp[i]++;
}
}
thisLevelNum --;
if(thisLevelNum == 0){
thisLevelNum = nextLevelNum;
nextLevelNum = 0;
step++;
}
}
return 0;
}
};