这题一开始想着有点麻烦,但是后面发现其实还是bfs 暴力搜索一波就行了
class Solution {
private:
int diff(string s1,string s2){
int d=0;
for(int i=0;i<s1.length();i++){
if(s1[i]!=s2[i])
d++;
}
return d;
}
vector<vector<int> > smap;
vector<int> result;
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
int idx=-1;
for(int i=0;i<wordList.size();i++){
if(wordList[i]==beginWord){
idx=i;
break;
}
}
if(idx==-1){
wordList.push_back(beginWord);
idx=wordList.size()-1;
}
for(int i=0;i<wordList.size();i++){
vector<int> tmp;
smap.push_back(tmp);
result.push_back(wordList.size()*2);
}
for(int i=0;i<wordList.size();i++){
for(int q=i+1;q<wordList.size();q++){
if(diff(wordList[i],wordList[q])==1){
smap[i].push_back(q);
smap[q].push_back(i);
}
}
}
result[idx]=1;
queue<int> qe;
qe.push(idx);
while(!qe.empty()){
int t=qe.front();
qe.pop();
for(int i=0;i<smap[t].size();i++){
if(result[smap[t][i]]>result[t]+1){
qe.push(smap[t][i]);
result[smap[t][i]]=result[t]+1;
}
}
}
for(int i=0;i<wordList.size();i++){
if(wordList[i]==endWord){
if(result[i]>wordList.size())
return 0;
else
return result[i];
}
}
return 0;
}
};