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; } };
相关文章推荐
- 部署多个Tomact到服务器上
- Android蓝牙学习笔记(二)
- [计算机网络学习笔记]:协议概述
- 栈的压入、栈的弹出
- 让linux history命令显示命令的运行时间、在哪个机器运行的这个命令
- Android经常使用自己定义控件
- PHP中extract()函数的妙用
- 2014编程之美挑战赛初赛题目
- 队列的C++实现
- Eclipse调试的三个小技巧
- 删除录音文件 广播通知更新媒体库
- python格式化字符串和转义字符
- J2EE中getParameter与getAttribute以及EL表达式${requestScope}和${param[]}
- 类的继承和派生
- Java编程思想重点笔记(Java开发必看)...转
- Android Fragment 常见问题及解决方案
- 数据泵expdp,impdp使用结
- 移动应用支付系列一:支付宝支付
- Centos7 安装lua
- 启发式算法个人理解