Word Ladder 宽搜超时 新方法未做!!!!!

题目:

点击打开链接

解答:

第一个思路,宽搜,跳过已经搜索过得元素。

超时。

 class Solution {
 public:
	 int ladderLength(string start, string end, unordered_set<string> &dict) {
		 int dp;
		 int size, newsize;
		 queue<string> qe;
		 map<string, bool> usedElement;
		 string temp;
		 qe.push(start);
		 //层数
		 dp = 1;
		 //该层节点数
		 size = 1;
		 //下一层节点数
		 newsize = 0;
		 if (start == end)
			 return 1;
		 while (!qe.empty())
		 {
			 //对于每一层的节点
			 for (int i = 0; i < size; i++)
			 {
				 //取出元素
				 temp = qe.front();
				 qe.pop();
				 //找到结果
				 if (oneChange(temp,end))
					 return dp+1;
				 //对于字典中的每个元素,如果没有用过并且两元素相差为1  加入到下一层
				 for (unordered_set<string>::iterator it = dict.begin(); it != dict.end(); it++)
				 {
					 if (!used(*it,usedElement) && oneChange(*it, temp))
					 {
						 qe.push(*it);
						 usedElement.insert(pair<string,bool>(*it, true));
						 ++newsize;
					 }
				 }
			 }
			 //层数(深度)加1
			 ++dp;
			 //更新该层节点数
			 size = newsize;
			 newsize = 0;
		 }
		 return 0;
	 }
 private:
	 //元素是否用过
	 bool used(string str, map<string, bool> &usedElement)
	 {
		 if (usedElement.find(str) == usedElement.end())
			 return false;
		 return true;
	 }
	 //两字符串相差是否是1
	 bool oneChange(string a, string b)
	 {
		 int changeNum = 0;
		 for (int i = 0; i < a.length(); i++)
		 {
			 if (a[i] != b[i])
				 ++changeNum;
		 }
		 if (changeNum == 1)
			 return true;
		 return false;
	 }
 };

第二个思路:

仍然是宽搜的思路,用了一种特殊的方法去简化复杂度,没看懂,先不看了后面补。

http://blog.csdn.net/yutianzuijin/article/details/12887747

还有一个trie树的思路:http://www.blogjava.net/menglee/archive/2013/12/19/407752.html


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值