Word Ladder
Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformation sequence from beginWord to endWord, 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.
class Solution {
public:
struct node{
string word;
int num;
node():num(0){}
};
int ladderLength(string beginWord, string endWord, unordered_set<string>& wordDict) {
if(beginWord==endWord)
return 1;
if(dif(beginWord,endWord)==1)
return 2;
queue<node> q;
unordered_set<string> ss;
node a;
a.word=beginWord;
q.push(a);
ss.insert(beginWord);
int res=-1,len,i,j;
while(!q.empty())
{
node b=q.front();
q.pop();
if(b.word==endWord)
{
res=b.num;
break;
}
len=b.word.size();
for(i=0;i<len;i++)
{
for(j=0;j<26;j++)
{
string tmp=b.word;
tmp[i]='a'+j;
if(tmp!=b.word&&wordDict.find(tmp)!=wordDict.end()&&ss.find(tmp)==ss.end())//注意判断
{
node xx;
xx.word=tmp;
xx.num=b.num+1;
q.push(xx);
ss.insert(tmp);
}
}
}
}
return res+1;
}
int dif(string a,string b)
{
int len=a.size();
int res=0;
for(int i=0;i<len;i++)
{
if(a[i]==b[i])
res++;
}
return len-res;
}
};