这道题非常难。

之前的题目我提到过一次用两个vector来做层序遍历的,就是由于这道题。要想最后恢复出单词变换的路径,就须要事先保存,依据dp中路径恢复的启示,保存的应该是一个单词的前一个变换节点。可能有非常多个单词都能变换到当前单词,因此应该是一个set。用一个二维的vector保存当前能够变换到的单词和变换出这些单词单词。每一维的vector存放的都是一个set。设存放当前可訪问单词的vector下标是current,存放变幻出这些单词的vector下标是pre,那么每一轮要開始更新current之前,都要从字典里删除pre中存放的单词。这样做比直接用一个set存放訪问过的单词要快,也更加节省空间,由于字典的规模在不断变小。由于要打印出所有的路径,所以不是说遇到目标单词就直接结束,而应该等着这一层的变换所有结束之后才行。假设在这一层变换之后发现了目标单词,那么就開始打印路径。

递归打印路劲跟其它题目的写法没有太多不同,主要是注意假设用引用做的话要合适的回退,且最后是反向打印的,应该把结果reverse一下再放到结果集中。

实现的时候还发现一个问题,我之前一直以为在訪问方面vector应该是最快的,所以就把全部东西都弄成了vector,然后下标訪问,结果超时了。假设要顺序訪问的话,迭代器要比随机訪问好。

class Solution {
public:
vector<vector<string> > res;
void getPaths(unordered_map<string, vector<string> > &predict, vector<string> &tpres, string &word){
if(predict[word].size() == 0){
tpres.push_back(word);
vector<string> pres = tpres;
reverse(pres.begin(), pres.end());
res.push_back(pres);
tpres.pop_back();
return;
}
tpres.push_back(word);
for(auto it=predict[word].begin();it!=predict[word].end();++it)
getPaths(predict, tpres, *it);
tpres.pop_back();
}
vector<vector<string> > findLadders(string start, string end, unordered_set<string> &dict) {
unordered_map<string, vector<string> > predict;
int cu = 0, pre = 1, len = start.length();
vector<unordered_set<string> > candi(2);
vector<string> tpres;
predict[start] = tpres;
candi[0].insert(start);
string word;
while(true){
cu = !cu;
pre = !pre;
for(auto it=candi[pre].begin();it!=candi[pre].end();++it){
dict.erase(*it);
}
candi[cu].clear();
for(auto it=candi[pre].begin();it!=candi[pre].end();++it){
for(int pos=0;pos<len;pos++){
word = *it;
for(char c='a';c<='z';c++){
if(word[pos] == c) continue;
word[pos] = c;
if(dict.count(word)>0){
candi[cu].insert(word);
predict[word].push_back(*it);
}
}
}
}
if(candi[cu].size() == 0) return res;
if(candi[cu].count(end))
break;
}
getPaths(predict, tpres, end);
return res;
}
};

leetcode第一刷_Word Ladder II的更多相关文章

  1. leetcode第一刷_Path Sum II

    在更新上面一道题的时候我就想,是不是另一道打印路径的,果不其然啊. 这样的题非经常见的,做法也非常easy,我是用一个引用的vector来存,满足条件之后直接压入结果集中,当然也能够用数组之类的,都一 ...

  2. leetcode第一刷_Spiral Matrix II

    跟上一题的策略全然一样,这个题是要求保存当前增加的是第几个数,由于矩阵里面存的就是这个东西. 我有尝试想过是不是有一种方法能够直接推算出每一行的数据是哪些.但没过多久就放弃了.这样的方法尽管能够避免在 ...

  3. leetcode第一刷_Jump Game II

    要求最小的步数,是不是非常easy想到用dp啊? 我一開始的做法是,当找到了一个可以从它延伸到更远的位置,就把这个位置和最远位置的步数都更新一下,结果超时了. 事实上这样不仅是超时的,并且是错误的.由 ...

  4. leetcode第一刷_Word Search

    这道题之前一直没敢做,没想到前天用递归一遍过了. . 当时为什么想着用递归,而不是dp呢.由于我想到达某个位置的情况有非常多,即使从当前位置開始的搜索是已知的,但之前的状态是如何的也无从得知啊,实话实 ...

  5. leetcode第一刷_Permutations II

    当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...

  6. leetcode第一刷_Populating Next Right Pointers in Each Node II

    很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...

  7. leetcode第一刷_Combination Sum Combination Sum II

    啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...

  8. leetcode第一刷_N-Queens II

    这个题好无趣,竟然输出解的个数.前一个题把全部解都输出出来了.还愁不知道解的个数吗. . 我怀疑这个解的个数是有一个类似通项的东西,就上网查了一下.没有啊亲,最后就把上一题的代码略微改了一下过掉了. ...

  9. leetcode第一刷_Best Time to Buy and Sell Stock II

    这道题尽管是上一道题的增强.可是反而简单了. 能够交易无数次,可是买卖必须成对的出现. 为了简单起见.我用abc三股股票来说明,且忽略掉相等的情况.三个数一共同拥有六种大小关系.注意他们之间的先后顺序 ...

随机推荐

  1. HTML5中的二进制大对象Blob(转)

    HTML5中的Blob对象和MYSQL中的BLOB类型在概念上是有点区别的.MYSQL中的BLOB类型就只是个二进制数据容器.而HTML5中的Blob对象除了存放二进制数据外还可以设置这个数据的MIN ...

  2. 关于android应用闪屏的几种情况

    1.主菜单进入某应用闪屏: 常见是一个空的activity作为launcher属性,实际上它什么事业没干,真正干事情的是从它通过intent启动的activity. 例子: public class ...

  3. javascript定义变量和优先级的问题

    本文链接: javascript定义变量和优先级的问题.转载请保留.   看下面的代码: if (!("aa" in window)) { alert('oh my god'); ...

  4. [jQuery编程挑战]003 克隆一个页面元素及其相关事件

    挑战: a) 绑定一个点击方法到这个div,点击后此元素会淡出消失 b) 同时克隆一个新的div元素到页面,元素内容是前面div文字内容反向书写(即,sgatbg olleh),同样也具有上面的点击事 ...

  5. jquery easy ui 学习 (1)Basic Window

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. CentOS安装rar、unrar解压缩软件的方法

    闲话不说,centos上如何安装rar.unrar在线解压缩软件呢?如果您的centos是32位的,执行如下命令: wget http://www.rarsoft.com/rar/rarlinux-3 ...

  7. UVA - 12627 Erratic Expansion 奇怪的气球膨胀 (分治)

    紫书例题p245 Piotr found a magical box in heaven. Its magic power is that if you place any red balloon i ...

  8. 【Oracle】ORACLE SQL Developer不支持JAVA版本

    ORACLE SQL Developer不支持JAVA版本 今天我打开 ORACLE SQL Developer准备开始练手.没有想到却给出了错误提示. 我 是安装了java JDK的而且是1.6版本 ...

  9. Ganglia + Nagios 初步实践

    参考文档: http://www.bubuko.com/infodetail-715636.html http://www.linuxidc.com/Linux/2014-01/95804p2.htm ...

  10. 使用Windows 系统性能监控来报警磁盘空间不足

    http://blog.csdn.net/jiangxinyu/article/details/4370288