描述
给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列的长度:
- 每一次转换只能改变一个单词
- 每一个中间词都必须存在单词字典当中
例如:
给定的初始单词start="red",
目标单词end ="tax"。
单词字典dict =["ted","tex","red","tax","tad","den","rex","pee"]
一个最短的转换序列为"red" -> "ted" -> "tad" -> "tax",
返回长度4
注意:
如果没有符合条件的转换序列,返回0。
题目中给出的所有单词的长度都是相同的
题目中给出的所有单词都仅包含小写字母
使用广度优先遍历种。
0)将start放入队列q1,初始count=0。
1)当q1非空,逐个遍历q1中的单词,count++;
2)设q1中的单词为str,寻找其邻近单词s,如果s等于end返回count+1;
否则将s放入队列q2中;
3)将q1与q2交换,继续执行1)。
其中代码修改了dict。
int ladderLength(string start, string end, unordered_set<string> &dict) {
queue<string> q1,q2,*p1,*p2;
int count=0;
for(p1=&q1,p2=&q2,p1->push(start);p1->size();swap(p1,p2)){
++count;
for(string str;p1->size();p1->pop()){
str = p1->front();
for(int i=0;i<str.length();++i){
string s=str;
for(char ch='a';ch<='z';++ch){
if (ch==str[i]) continue;
s[i] = ch;
if (s==end) return count+1;
if (dict.find(s)!=dict.end()){
p2->push(s);
dict.erase(s); // 防止死循环(回路)
}
}
}
}
}
return 0;
}