Word Ladder II


超时:

bool operator <(const pair<string,int> &f, const pair<string, int> &s)
{
	return f.second > s.second;
}

class Solution {
public:
	typedef unordered_map<string,vector<string> > svsmp;
	typedef unordered_map<string,vector<vector<string> > > svvsmp;
	typedef unordered_map<string,int> simp;
	typedef unordered_map<string, bool >sbmp;

	
    vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
        svsmp graph;
		svsmp rt;
		sbmp vst;
		simp dist;
		
		generate_graph(dict, graph);


		for(unordered_set<string>::iterator it = dict.begin(); it != dict.end(); ++it)
		{
			vector<string> gv = graph[*it];
			
			//cout <<*it<<"-->";
			//for(int i = 0; i < gv.size(); i++)cout << gv[i]<< " ";
			//cout<<endl;

			dist[*it] = INT_MAX;
		}

		priority_queue<pair<string, int> >q;
		q.push(make_pair(start, 0));
		dist[start] = 0;
		//vst[start] = true;
		vector<string> v;
		while(!q.empty())
		{
			string from =  q.top().first;
			q.pop();
			if(vst.find(from) != vst.end())
			{
				//cout << from << "===>"<<vst[from]<<endl;
				continue;
			}
			
			vst[from] = true;
			v = graph[from];
			for(int i = 0; i < v.size(); i++)
			{
				string to = v[i];
				if(vst.find(to) != vst.end())continue;
				int distw = dist[from];
				
				
				if(dist[to] > distw + 1)
				{

					dist[to] = distw + 1;
					q.push(make_pair(to, distw + 1));
					vector<string> routev;
					routev.push_back(from);
					rt[to] = routev;
				}
				else if(dist[to] == distw + 1)
					rt[to].push_back(from);
				
				//cout<<endl;
			//	cout << from <<"-->"<< to << dist[to]<<endl;
			}
		}
	
		/*for(unordered_map<string, vector<string> >::iterator it = rt.begin(); it != rt.end(); ++it)
		{
			//cout << it->first<<"=>";
			for(int i = 0; i < (it->second).size(); i++)
				cout << (it->second)[i]<<" ";
			cout << endl;
		}*/
		svvsmp rst;
		return generate_route(rt, end,rst);
		
    }

	vector<vector<string> > generate_route(svsmp &rt, string &end, svvsmp &rst)
	{
		if(rst.find(end) != rst.end())return rst[end];
		vector<vector<string> > rtv;
		vector<string>v;
		if(!rt[end].size())
		{
			v.push_back(end);
			rtv.push_back(v);
			rst[end] = (rtv);
			return rtv;
		}
		
		//v.push_back(end);
		//rtv.push_back(v);
		vector<vector<string> > rtvct;
		//cout << end<<"--->";
		for(int i = 0; i < rt[end].size();i++)
		{
			rtvct = generate_route(rt, rt[end][i], rst);
			for(int j = 0; j < rtvct.size(); j++)
			{
				rtvct[j].push_back(end);
				rtv.push_back(rtvct[j]);
			}
				
		}
		//for(int i = 0; i < rtv.size(); i++)rtv[i].push_back(end);
		//cout<<endl;
		rst[end] = rtv;
		return rtv;
	}

	

	void generate_graph(unordered_set<string> &dict,unordered_map<string, vector<string> > &graph)
	{
		vector<string> v;
		for(unordered_set<string>::iterator it = dict.begin(); it != dict.end(); ++it)
		{
			unordered_set<string>::iterator scd = it;
			for(++scd; scd != dict.end(); ++scd)
			{
				if(could_change(*it, *scd))
				{
					if(graph.find(*it) == graph.end())graph[*it] = v;
					if(graph.find(*scd) == graph.end())graph[*scd] = v;
					graph[*it].push_back(*scd);
					graph[*scd].push_back(*it);
				}
			}
		}
	}

	bool could_change(const string &s1,const string &s2)
	{
		if(s1.size() != s2.size())return false;
		if(!s1.size() || !s2.size())return false;
		int dif = 0;
		for(int i = 0; i < s1.size(); i++)
		{
			if(s1[i] != s2[i])dif++;
			if(dif > 1)return false;
		}
		return true;
	}

};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值