原题地址:

https://oj.leetcode.com/submissions/detail/19446353/

题目内容:

Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

Return

  [
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]

Note:

  • All words have the same length.
  • All words contain only lowercase alphabetic characters.

方法:

在这里我分享下做这道题的心路,不,思路历程。

首先第一时间想到BFS,打算正常BFS,但是跟一般的BFS标记结点时不一样,由于可能通过不同路径到达,所以入队前不能标记结点,而是出队时扩展子结点前标记。

结果:TLE

然后考虑到,A、B、C、D到能某个结点,比如说F时,可能会重复计算F到终点的路径。考虑先BFS一次求出最短路径作为fullstep的参数,然后以类似动态规划的思路来记录下子问题的结果。其中具体的实现非常的复杂,同样的点,必须在固定的步数内才算有解。

结果:TLE

又想到,用unordered_set或者unordered_map装字符串,计算hash值时要遍历整个字符串,这个时候不如整数快。于是,就想到不记录字符串,而记录字符串的地址。字符串在从输入获得的set中。由于int损失了精度,就用long long来存。

结果:TLE

没办法了,想到返回子问题解的时候返回的是整个vector,有复制过程,那就换,换成指针,不复制整个vector了。

结果:TLE

干,那就提前建图!提前建好图,在图上做这一坨玩意,就不用老是重复拿26个字母穷举所有位置的情况了!

结果:TLE

最后的最后的最后,有点想放弃了,在意识模糊的情况下,就采用了提前建图 + BFS的思路。

结果居然TM AC了!

全部代码:

class Solution {

public:
unordered_map<long long,vector<long long>> map; // 提前建图
unordered_set<long long> mark; // 标记某个点是否已经访问过
struct node {
int len;
node *father;
string *self;
}; void generateMap(unordered_set<string> &dict) {
unordered_set<string> :: iterator it1;
unordered_set<string> :: iterator it2;
unordered_set<long long> :: iterator it3;
unordered_set<long long> used;
for (it1 = dict.begin(); it1 != dict.end(); ++ it1) {
vector<long long> tmp;
map[(long long) & (*it1)] = tmp;
}
for (it1 = dict.begin(); it1 != dict.end(); ++ it1) {
string *now = (string *) & (*it1);
used.insert((long long) now);
for (int i = 0; i < (*now).size(); ++ i) {
char pre = (*now)[i];
for (int j = 'a'; j <= 'z'; ++ j) {
if (j == pre)
continue;
(*now)[i] = j;
it2 = dict.find(*now);
if (it2 != dict.end()) {
it3 = used.find((long long) & (*it2));
if (it3 == used.end()) {
map[(long long) now].push_back((long long) & (*it2));
map[(long long) & (*it2)].push_back((long long) now);
}
}
}
(*now)[i] = pre;
}
}
} vector<string> generateVector(node *tmp) {
vector<string> res;
while (tmp) {
res.push_back(*(tmp->self));
tmp = tmp->father;
}
return res;
} vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
generateMap(dict);
queue<node> myque;
unordered_set<string> :: iterator it1;
vector<vector<string>> res;
vector<node> tmp;
node startnode;
it1 = dict.find(end);
startnode.len = 1;
startnode.father = NULL;
startnode.self = (string *) & (*it1);
myque.push(startnode);
it1 = dict.find(start);
string *fin = (string *)&(*it1);
while (!myque.empty()) {
node now = myque.front();
node *fa = new node;
*fa = now;
if (now.self == fin) {
vector<string> lst = generateVector(fa);
res.push_back(lst);
int limit = now.len;
myque.pop();
while (!myque.empty()) {
node last = myque.front();
if (last.self == fin && last.len == limit) {
lst = generateVector(&last);
res.push_back(lst);
}
myque.pop();
}
break;
}
mark.insert((long long)(now.self));
vector<long long> *vecptr = &map[(long long)(now.self)];
for (int i = 0; i < (*vecptr).size(); ++ i) {
unordered_set<long long> :: iterator it2 = mark.find((*vecptr)[i]);
if (it2 == mark.end()) {
node child;
child.len = now.len + 1;
child.father = fa;
child.self = (string *)(*vecptr)[i];
myque.push(child);
}
}
myque.pop();
}
return res;
}
};

  

后记:

之前那个BFS + 回溯 + DP的方法没能AC太可惜了,我那里指针玩的6得自己都怕,唉。。

【原创】leetCodeOj --- Word Ladder II 解题报告 (迄今为止最痛苦的一道题)的更多相关文章

  1. LeetCode: Word Ladder II 解题报告

    Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation s ...

  2. LeetCode: Word Break II 解题报告

    Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a senten ...

  3. 【原创】leetCodeOj --- Jump Game II 解题报告

    原题地址: https://oj.leetcode.com/problems/jump-game-ii/ 题目内容: Given an array of non-negative integers, ...

  4. 【LeetCode】212. Word Search II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 前缀树 日期 题目地址:https://leetco ...

  5. 【LeetCode】140. Word Break II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归求解 日期 题目地址:https://leetc ...

  6. 【LeetCode】244. Shortest Word Distance II 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典保存出现位置 日期 题目地址:https://le ...

  7. [Leetcode Week5]Word Ladder II

    Word Ladder II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/word-ladder-ii/description/ Descripti ...

  8. [leetcode]Word Ladder II @ Python

    [leetcode]Word Ladder II @ Python 原题地址:http://oj.leetcode.com/problems/word-ladder-ii/ 参考文献:http://b ...

  9. 【leetcode】Word Ladder II

      Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ...

随机推荐

  1. Eclipse添加和查看书签

    添加书签: 在编辑框左边栏右击 > Add Bookmark > 编辑书签名称(可以直接使用默认名称)> OK 查看书签: Window > Show View > Ot ...

  2. 摘要算法CRC8、CRC16、CRC32,MD2 、MD4、MD5,SHA1、SHA256、SHA384、SHA512,RIPEMD、PANAMA、TIGER、ADLER32

    1.CRC8.CRC16.CRC32 CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长,应用也十分广泛,尤其是通讯领域,现在应用最多的就是 CRC32 算法,它产 ...

  3. 【Matlab编程】Matlab让电脑失而复得

    在学校常常有同学电脑失窃,大抵都是粗细大意.据说iPhone手机失窃后能够获取小偷的照片,从而将照片找到.如今用matlab写一个程序使得当小偷使用电脑上网时,电脑自己主动将电脑前面的人的照片发到你指 ...

  4. LAN路由

    一.实验的目的:   实现不同子网之前的信息交流      二.如果 1.虚拟子网 VMnet8:192.168.233.0/24 VMnet1:172.16.1.0/24 2.虚拟机vm1 ip:1 ...

  5. JAVA线程相互排斥问题

    public class TraditionalThreadSynchonized { public static void main(String[] args) { final OutPuter ...

  6. JavaScript 中的事件对象(读书笔记思维导图)

    在触发 DOM 上的某个事件时,会产生一个事件对象 event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对象中,会包含 ...

  7. onkeypress事件.onkeydown事件.onkeyup事件

    onkeypress事件是在按键開始按的时候发生: onkeydown事件是在按键已经按下的时候发生: onkeyup事件是在按键松开(释放)的时候发生.

  8. zoj3795 Grouping --- 良好的沟通,寻找最长的公路

    给定一个图,为了保持图分裂至少成多个集合的集合内可以使点没有直接或间接的关系. 首先,题意可以得到图中可能含有环.该环的内侧是肯定是要被拆卸. 图点降低建DAG画画,能想象..图从零点渗透深入,在点中 ...

  9. Android_app项目开发步骤总结

    做了几个android企业应用项目后,总结了项目的基本开发步骤.希望可以交流. 一 应用规划:      ※确定功能.      ※必须的界面及界面跳转的流程.      ※须要的数据及数据的来源及格 ...

  10. ExtJs 设置GridPanel表格文本垂直居中

    业务场景,需要实现最终效果图如下: GridPanel代码如下配置: { xtype : 'grid', id : 'grid_jglb', frame : true, region : 'cente ...