码迷,mamicode.com
首页 > 其他好文 > 详细

Word Ladder II

时间:2015-01-01 14:45:57      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

这道题做了好长时间都没通过,参考了http://blog.csdn.net/niaokedaoren/article/details/8884938的实现,其中在求前驱单词记录时,申请的数组要采用vector<unordered_set<string>>这样,在判断是否结束时,查找效率更高,否则用前向单词记录表查找时效率会很低。

算法中的递归找paht可以用栈来避免递归,是一个优化点。

class Solution {
public:

      vector<vector<string>> wordsladders;

    vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {

	  
		
		  unordered_map<string,vector<string>> forword;
		  dict.insert(end);
		  InitData(forword,dict);
		  bool ret;
		  ret = GetTraces(forword,start,end,dict);
	      if(ret == false)
		  	return wordsladders;
		  vector<string> path;
		  GetPath(end,forword,path);

	      return wordsladders;
		
    }
	void GetPath(string& tempstr,unordered_map<string,vector<string>> &forword,vector<string>& path)
    {
    
	  vector<string> result;
	  path.push_back(tempstr);

	  if(forword[tempstr].empty())
	  {
	     result.resize(path.size());
         copy(path.rbegin(), path.rend(),result.begin());
		 wordsladders.push_back(result);
		 path.pop_back();
         return ;
	  }
	  	
      for(auto ite = forword[tempstr].begin(); ite!= forword[tempstr].end(); ite++)
      {
      	 GetPath(*ite,forword,path);
	  }
	  path.pop_back();

	}
	void InitData(unordered_map<string,vector<string>> &forword,unordered_set<string> &dict)
	{
	   unordered_set<string>::iterator ite;
	   pair<string,vector<string>> temp;
       for(ite = dict.begin(); ite!= dict.end(); ite++)
       { 
          temp.first = *ite;
          forword.insert(temp);
	   }

	}
	bool GetTraces(unordered_map<string,vector<string>> &forword,string& start,string& end,unordered_set<string> &dict)
	{
	      vector<unordered_set<string> > buf(2); 
		  int cur,pre;
          cur =0;
		  pre =1;
		  string tempstr;
		  buf[0].insert(start);
		  while(1)
		  {
			   cur = !cur;
			   pre = !pre;
	           for(auto ite = buf[pre].begin(); ite != buf[pre].end(); ite++)
	           {
	               dict.erase(*ite);
			   }
			   for(auto ite = buf[pre].begin(); ite!= buf[pre].end(); ite++)
			   {
	               for(int i = 0; i < (*ite).size(); i++)
			       {
			           tempstr = *ite;
			           for(int j=0; j< 26;j++)
			           {
			      
			             if(‘a‘+j == tempstr[i])
						  continue ;
						 tempstr[i] = ‘a‘+j;
						 if(dict.find(tempstr) == dict.end())
						   continue;
						 forword[tempstr].push_back(*ite);
						 buf[cur].insert(tempstr);
					   }

				  }

			 }
			 buf[pre].clear();
			 if(buf[cur].size() == 0)
			 	return false;
			 if(buf[cur].count(end))
			 	 return true;
		
		

		}
	   
   }
		
};

  

Word Ladder II

标签:

原文地址:http://www.cnblogs.com/xgcode/p/4197187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!