解题思路
首先定义一个函数用于检查两个字符串是否只有一个字符不同。
采用广度优先搜索,定义一个队列,先将start字符串放入队列中,之后队列不为空时,用size记录当前队列中字符串的个数,表明当前的size个字符串中若有与目标字符串相差一个字符的字符串,则转换序列长度为res+1.否则将与该字符串相差一个字符且存在于字典的字符串全部入队,且在字典中删除相应的字符串。这些字符串若能成功转换为目标字符串,转换序列比当前size个字符串的转换序列多一。若队列已经空了还是没有找到转换序列,则返回0,表示不存在这样的转换序列。
代码
class Solution {
public:
bool oneDifferent(const string &s1,const string &s2){
int d = 0;
for(int i = 0;i < s1.size();i++){
if(s1[i] != s2[i])
d++;
}
return d == 1 ? true : false;
}
int ladderLength(string start, string end, unordered_set<string> &dict) {
int res = 0;
queue<string>q;
q.push(start);
while(!q.empty()){
res++;
int size = q.size();
while(size--){
string tmp = q.front();
q.pop();
if(oneDifferent(tmp,end))
return res + 1;
else{
vector<string>delete_list;
for(unordered_set<string>::iterator it = dict.begin();it != dict.end();it++){
if(oneDifferent(*it,tmp)){
q.push(*it);
delete_list.push_back(*it);
}
}
for(int i = 0;i < delete_list.size();i++)
dict.erase(delete_list[i]);
}
}
}
return 0;
}
};