`
bcyy
  • 浏览: 1824282 次
文章分类
社区版块
存档分类
最新评论

Leetcode Word Ladder II

 
阅读更多

Word Ladder II


Given two words (startandend), and a dictionary, find all shortest transformation sequence(s) fromstarttoend, 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.


Leetcode 第一难题,六星级! 帆船酒店来了!

难点考点:

1 知道什么时候去掉重复,会使用set容器避免重复

2 高级层序遍历树应用

3 适当时候去掉字典中的单词避免重复

4 知道什么时候结束层序

5 利用高级数据结构保存结果,本程序使用unordered_map<string, vector<string> >

6 使用递归回溯法,利用高级数据结构,构造最终结果

每一点几乎都可以成为一个大题,都糅合在一起了,加上各个细节,那么就构成了一个六星级难题了。


注意细节:
1 上一层的单词要删掉,否则会有回路,形成无线循环

2 下一层保存单词不能重复,否则会有很多多余的单词处理,造成time limit excessed


新思维解决问题:
子节点可以重复,但是只保留一个子节点,不过要保留这个子节点的多个父母节点,但是子节点只能保留一份。
要怎么完成这个操作呢?
1 使用set保留子节点
2 使用map<string, vector<string> > 保留父母节点,这样确保只有一个string子节点,而可以有多个父母节点vector<string>
形成path的时候,因为最终根节点肯定是start,所以一个孩子节点分别从多个父母节点回溯,都必然会到达start根节点


//2014-2-18 update
	vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict)
	{
		vector<vector<string> > rs;
		unordered_map<string, vector<string> > ump_sv;
		dict.erase(start);
		dict.erase(end);

		vector<string> qu[2];
		set<string> sst;
		qu[0].push_back(start);
		bool idx = false;
		bool finished = false;
		while (!qu[idx].empty())
		{
			while (!qu[idx].empty())
			{
				string s = qu[idx].back();
				for (int i = 0; i < s.length(); i++)
				{
					char a = s[i];
					for (char az = 'a'; az <= 'z'; az++)
					{
						s[i] = az;
						if (s == end) 
						{
							finished = true;
							ump_sv[s].push_back(qu[idx].back());
						}
						else if (dict.count(s))
						{
							ump_sv[s].push_back(qu[idx].back());
							qu[!idx].push_back(s);
						}
					}
					s[i] = a;
				}//for
				qu[idx].pop_back();
			}//while
			if (finished) break;
			idx = !idx;

			sst.clear();
			sst.insert(qu[idx].begin(), qu[idx].end());
			qu[idx].assign(sst.begin(), sst.end());

			for (auto x:qu[idx]) dict.erase(x);
		}//while
		if (!ump_sv.count(end)) return rs;
		vector<string> tmp(1, end);
		constructLadder(rs, tmp, ump_sv, start, end);
		return rs;
	}
	void constructLadder(vector<vector<string> > &rs, vector<string> &tmp, 
		unordered_map<string, vector<string> > &ump_sv, string &start, string &cur)
	{
		if (cur == start)
		{
			rs.push_back(tmp);
			reverse(rs.back().begin(), rs.back().end());
			return;
		}
		vector<string> v = ump_sv[cur];
		for (int i = 0; i < v.size(); i++)
		{
			tmp.push_back(v[i]);
			constructLadder(rs, tmp, ump_sv, start, v[i]);
			tmp.pop_back();
		}
	}




分享到:
评论

相关推荐

    126.Word Ladder II 词语阶梯二【LeetCode单题讲解系列】

    126.Word_Ladder_II_词语阶梯二【LeetCode单题讲解系列】

    word ladder

    经典字梯游戏c++代码,经测试通过的哦,leetcode上面的题目

    Coding Interview In Java

    6 Word Ladder II 29 7 Median of Two Sorted Arrays 33 8 Kth Largest Element in an Array 35 9 Wildcard Matching 37 10 Regular Expression Matching in Java 39 11 Merge Intervals 43 12 Insert Interval 45 ...

    leetcode316-LeetCode:leetcode的解决方案

    leetcode 316 LeetCode Summary Exclusive Time of Functions: 栈 Friend Circles:DFS Print Binary Tree:二叉树 Maximal Square:DP Maximal Rectangle:单调栈(Histogram变形) Largest Rectangle in Histogram:...

    leetcode多少题-word_ladder:字梯

    leetcode 多少题带有堆栈和队列的字梯 您将针对 Lewis Carroll ...在本作业中,您将实现一个函数word_ladder来生成这些字梯。 有许多可能的算法来生成字梯,但一个简单的算法使用堆栈和队列的组合,如

    leetcode-python:python中的leetcode

    力扣 Python 解决方案Leetcode 是准备技术编码面试的...特别案例: Word Ladder II,我的 AC 代码比这个 repo 中的代码慢得多。 但是这个 repo 中的一个得到了 TLE,不知道为什么。 任何想法都将受到高度赞赏。 谢谢!

    LeetCode解题总结

    9.1 单词变换路径(Word Ladder) 9.1.1 是否存在变换路径 9.1.2 所有最短变换路径9.2 包围区域 10. 深度优先搜索 10.1 N皇后问题 10.2 恢复IP地址 10.3 集合元素之和 10.3.1 元素可以重复 10.3.2 元素不可重复 ...

    cpp-算法精粹

    Word Ladder II Surrounded Regions 总结 深度优先搜索 Additive Number Palindrome Partitioning Unique Paths Unique Paths II N-Queens N-Queens II Restore IP Addresses Combination Sum Combination Sum II ...

    javalruleetcode-leetcode:更多信息请访问Gitbook:https://wentao-shao.gitbook.io/

    java lru leetcode ...Ladder Add Two Numbers Matrix Spiral Matrix Mergesort [Algorithm Swap](Mergesort/Algorithm swap.md) Numbers Queue Stack Toposort Trie Tree Two Pointers Union Find

Global site tag (gtag.js) - Google Analytics