您的位置:首页 > 其它

127. Word Ladder

2016-04-09 17:22 232 查看
//超时
class Solution {
public:
bool can_go(string &s1,string &s2)
{
if(s1.size()!=s2.size()) return false;
int j=0;
for(int i=0;i<s1.size();i++)
{
if(s1[i]!=s2[i]) j++;
}
return j==1;
}
int find_path(string beginWord, string &endWord, unordered_set<string> &wordList,int l,int &min_l,bool &flag,unordered_set<string>& w)
{

if(can_go(beginWord,endWord))
{
if(flag||l<min_l) min_l=l;
flag=false;
cout<<l<<beginWord<<min_l<<endl;
return min_l;
}
for(string s :wordList)
{
if(can_go(s,beginWord)&&w.find(s)==w.end())
{
w.insert(s);
find_path(s,endWord,wordList,l+1,min_l,flag,w);
w.erase(s);
}
}
return min_l;
}
int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) {
bool flag=true;
unordered_set<string> w;
int min_l=0;
return find_path(beginWord,endWord,wordList,0,min_l,flag,w);

}
};


//超时
class Solution {
public:
int find_path(string beginWord, string &endWord, unordered_set<string> &wordList,int l,int &min_l,bool &flag,unordered_set<string>& w)
{

if(beginWord==endWord)
{
if(flag||l<min_l) min_l=l;
flag=false;
//cout<<l<<beginWord<<min_l<<endl;
return min_l;
}
for(int i=0;i<beginWord.size();i++)
{
char s=beginWord[i];
for(int j=0;j<26;j++)
{
if('a'+j==s) continue;
beginWord[i]='a'+j;
if(w.find(beginWord)==w.end()&&wordList.find(beginWord)!=wordList.end())
{
w.insert(beginWord);
find_path(beginWord,endWord,wordList,l+1,min_l,flag,w);
w.erase(beginWord);
}
}
beginWord[i]=s;
}
return min_l;
}
int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) {
bool flag=true;
unordered_set<string> w;
int min_l=0;
return find_path(beginWord,endWord,wordList,0,min_l,flag,w);

}
};


//1300ms
//虽然时间很差,但是思路很不错,我们获取到达每一个单词的最小步数,从而得到endWord的最小步数
//focus on
//i=w.erase(i);
//q.push(make_pair(beginWord,1));
class Solution {
public:
bool can_go(const string &s1,string &s2)
{
if(s1.size()!=s2.size()) return false;
int j=0;
for(int i=0;i<s1.size();i++)
{
if(s1[i]!=s2[i]) j++;
if(j>1) return false;
}
return j==1;
}
int ladderLength(string beginWord, string endWord, unordered_set<string>& w) {
if(can_go(beginWord,endWord)) return 2;
queue<pair<string,int>> q;
q.push(make_pair(beginWord,1));
while(!q.empty())
{
pair<string,int> a=q.front();
q.pop();
for(auto i=w.begin();i!=w.end();)
{
if(can_go(*i,a.first))
{
if(can_go(*i,endWord)) return a.second+2;
q.push(make_pair(*i,a.second+1));
i=w.erase(i);
}
else i++;
}
}
return 0;

}
};


//292ms 更换查询下一层元素的方法
class Solution {
public:
int ladderLength(string beginWord, string endWord, unordered_set<string>& w) {
queue<pair<string,int>> q;
q.push(make_pair(beginWord,1));
while(!q.empty())
{
pair<string,int> a=q.front();
q.pop();
for(int i=0;i<a.first.size();i++)
{
char s=a.first[i];
for(int j=0;j<26;j++)
{
if('a'+j==s) continue;
a.first[i]='a'+j;
if(a.first==endWord) return a.second+1;
if(w.find(a.first)!=w.end())
{
q.push(make_pair(a.first,a.second+1));
w.erase(a.first);
}

}
a.first[i]=s;
}

}
return 0;

}
};


//224ms 双向递归
class Solution {
public:
int ladderLength(string beginWord, string endWord, unordered_set<string>& w) {
unordered_set<string> s1;
unordered_set<string> s2;
s1.insert(beginWord);
s2.insert(endWord);
int l=1,r=1;
while(!s1.empty()&&!s2.empty())
{
unordered_set<string> temp;
for(string k :s1)
{
for(int i=0;i<k.size();i++)
{
char s=k[i];
for(int j=0;j<26;j++)
{
if('a'+j==s) continue;
k[i]='a'+j;
if(s2.find(k)!=s2.end()) return l+r;
if(w.find(k)!=w.end())
{
temp.insert(k);
w.erase(k);
}
}
k[i]=s;
}
}
s1=temp;
temp.clear();
l++;
for(string k:s2)
{
for(int i=0;i<k.size();i++)
{
char s=k[i];
for(int j=0;j<26;j++)
{
if('a'+j==s) continue;
k[i]='a'+j;
if(s1.find(k)!=s1.end()) return l+r;
if(w.find(k)!=w.end())
{
temp.insert(k);
w.erase(k);
}
}
k[i]=s;
}
}
s2=temp;
r++;
}
return 0;
}
};


//final 70ms 加入选择规则,每次都是从数量少的那组向下一层递归
class Solution {
public:
int ladderLength(string beginWord, string endWord, unordered_set<string>& w) {
unordered_set<string> s1;
unordered_set<string> s2;
unordered_set<string> *s01;
unordered_set<string> *s02;
s1.insert(beginWord);
s2.insert(endWord);
int l=2;
while(!s1.empty()&&!s2.empty())
{
if(s1.size()<s2.size())
{
s01=&s1;
s02=&s2;
}
else
{
s01=&s2;
s02=&s1;
}
unordered_set<string> temp;
for(string k :*s01)
{
for(int i=0;i<k.size();i++)
{
char s=k[i];
for(int j=0;j<26;j++)
{
if('a'+j==s) continue;
k[i]='a'+j;
if(s02->find(k)!=s02->end()) return l;
if(w.find(k)!=w.end())
{
temp.insert(k);
w.erase(k);
}
}
k[i]=s;
}
}
*s01=temp;
l++;
}
return 0;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: