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.
算法思想:
因为所有单词等长,且只包含小写字母,所以只要将每个单词从前往后把每个字母换一遍,从dict中查有没有就可以了
因为要求最短路径长,所以用到广度优先搜索
struct node{
string str;
int length;
node(string x,int l):str(x),length(l){}
};
class Solution{
public:
int bfs(string start,string end,unordered_set<string> dict){
queue<node> que;
unordered_set<string>::iterator it;
unordered_set<string> flag;
bool found=false;
int minS=0x7fffffff;
flag.insert(start);
que.push(node(start,1));
while(!que.empty()){
node cur=que.front();
que.pop();
for(int i=0;i<cur.str.size();i++){
for(int j=0;j<26;j++){
node next=cur;
if(cur.str[i]!=j+'a'){
next.str[i]=j+'a';
if(next.str==end){
found=true;
return next.length+1;
}
it=dict.find(next.str);
if(!found&&it!=dict.end()&&flag.find(next.str)==flag.end()){
next.length++;
flag.insert(next.str);
que.push(next);
}
}
}
}
}
return 0;
}
int ladderLength(string start,string end,unordered_set<string> &dict){
return bfs(start,end,dict);
}
};