leetcode Word Ladder II

本文详细介绍了如何使用BFS算法寻找相邻单词,并通过保存路径中的每个单词前驱来实现DFS遍历所有最短路径的过程。通过实例分析,对比了与Wordladder的不同之处,阐述了在复杂变换路径查找场景下,BFS与DFS的高效应用与优化策略。

此题与word ladder相比,求解相邻单词的方法相同,均为BFS。因此题还需要将所有最短的路径全部输出,

所以需要保存路径中每个单词的前驱,得到前驱后DFS遍历所有最短路径。


步骤:

1,同word ladder,利用BFS来找到相邻单词,因为是BFS,所以可以保证在得到第一条路径后遍历完该层结点就可以结束整个搜索过程,因为BFS方法得到的第一条路径即为最短路径。 

2,在1过程中,搜索所有和当前单词只差一个字母的单词,查询新单词是否在字典中同时是否已经存在于变换路径中,如果在字典中同时不在已有的变换路径中,把新单词放入队列,继续BFS

3,对得到的前驱结点信息进行DFS,从end出发遍历出所有最短路径。


根据上述思路

代码如下,提示超时

class Solution
{
public:
	vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict)
	{
		 vector<vector<string>> result;
	    if(start==end)
	        return result;

		unordered_map<string, vector<string>> fatherMap;

		queue<string> queuePop, queuePush, queueTemp;

		unordered_set<string> tempSet;

		bool flag = false;

		queuePop.push(start);

		while(!queuePop.empty()&&!flag)
		{
			
			queue<string> queueTemp = queuePop;
			
			while(!queueTemp.empty())
			{
				tempSet.insert(queueTemp.front());
				queueTemp.pop();
			}

			while(!queuePop.empty())			
			{
				string str(queuePop.front());
				queuePop.pop();

				for(int i = 0; i < str.size(); ++i)
					for(char j = 'a'; j <= 'z'; ++j)
					{
						if(str[i]==j)
							continue;

						char tempChar = str[i];
						str[i] = j;

						if(str == end)
						{
							flag = true;
						}

						if(dict.count(str)&&!tempSet.count(str))
						{
							string tempStr = str;
							tempStr[i] = tempChar;
							fatherMap[str].push_back(tempStr);
							queuePush.push(str);														

						}

						str[i] = tempChar;
					}
			}

			swap(queuePop, queuePush);
		
		}

		vector<string> tempVectorStr;
		if(!flag) 
			return result;
			
		dfsLadders(fatherMap, start, end, tempVectorStr, result);

		return result;
	
	}


	void dfsLadders(unordered_map<string, vector<string>> &fatherMap, string start, string end, vector<string> tempVectorStr, vector<vector<string>> &result)
	{
		if(end == start)
		{
			tempVectorStr.push_back(end);
			vector<string> tempVector = tempVectorStr;
			reverse(tempVector.begin(), tempVector.end());
			result.push_back(tempVector);
			tempVectorStr.pop_back();
			return;
		
		}


		tempVectorStr.push_back(end);
		
		for(int i = 0; i < fatherMap.find(end)->second.size(); ++i)
		{
			dfsLadders(fatherMap, start, fatherMap.find(end)->second.at(i), tempVectorStr, result);			
		}
	

		tempVectorStr.pop_back();
		
	}
	
	

};



后面参考http://www.cnblogs.com/x1957/p/3526838.html

程序思想一致,代码大同小异,但是其代码Accept,而本人的代码不知道哪里出了问题,后面有时间继续研究。

Accept的代码

class Solution {
public:
    vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
          vector<vector<string> >ans;
          if(start == end) return ans;
          unordered_set<string>current , next;
          unordered_set<string> flag;
          unordered_map<string,vector<string> > father;
          
          current.insert(start);

          bool found = false;
         
          while(!current.empty() && !found) {
              //expand
              for(const auto &x : current) {
                  flag.insert(x);
              }
              
              for(auto x : current) {
                  for(int i = 0 ; i < x.size() ; ++i) {
                      for(int j = 'a' ; j <= 'z' ; ++j) {
                          if(x[i] == j) continue;
                          string tmp = x;
                          tmp[i] = j;
                          if(tmp == end) found = true;
                          if(dict.find(tmp) != dict.end() && flag.find(tmp) == flag.end()) {
                              next.insert(tmp);
                              father[tmp].push_back(x);
                          }
                     }
                  }
              }
              //end expand
              
              current.clear();
              swap(current, next);
          }
          //start foudn father
          
          if(found) {
              vector<string> c;
              dfs(ans , father , c , start , end);
          }
          return ans;
    }
private:
    void dfs(vector<vector<string> >&ans, 
             unordered_map<string,vector<string> >& father ,
             vector<string>& c , 
             string& start ,
             string& now) {
                 
        c.push_back(now);
        if(now == start) {
            ans.push_back(c);
            reverse(ans.back().begin() , ans.back().end());
            c.pop_back();
            return;
        }
        auto que = father.find(now) -> second;
        for(auto& x : que) {
            dfs(ans , father , c , start , x);
        }
        c.pop_back();
    }
};


本 PPT 介绍了制药厂房中供配电系统的总体概念与设计要点,内容包括: 洁净厂房的特点及其对供配电系统的特殊要求; 供配电设计的一般原则与依据的国家/行业标准; 从上级电网到工厂变电所、终端配电的总体结构与模块化设计思路; 供配电范围:动力配电、照明、通讯、接地、防雷与消防等; 动力配电中电压等级、接地系统形式(如 TN-S)、负荷等级与可靠性、UPS 配置等; 照明的电源方式、光源选择、安装方式、应急与备用照明要求; 通讯系统、监控系统在生产管理与消防中的作用; 接地与等电位连接、防雷等级与防雷措施; 消防设施及其专用供电(消防泵、排烟风机、消防控制室、应急照明等); 常见高压柜、动力柜、照明箱等配电设备案例及部分设计图纸示意; 公司已完成的典型项目案例。 1. 工程背景与总体框架 所属领域:制药厂房工程的公用工程系统,其中本 PPT 聚焦于供配电系统。 放在整个公用工程中的位置:与给排水、纯化水/注射用水、气体与热力、暖通空调、自动化控制等系统并列。 2. Part 01 供配电概述 2.1 洁净厂房的特点 空间密闭,结构复杂、走向曲折; 单相设备、仪器种类多,工艺设备昂贵、精密; 装修材料与工艺材料种类多,对尘埃、静电等更敏感。 这些特点决定了:供配电系统要安全可靠、减少积尘、便于清洁和维护。 2.2 供配电总则 供配电设计应满足: 可靠、经济、适用; 保障人身与财产安全; 便于安装与维护; 采用技术先进的设备与方案。 2.3 设计依据与规范 引用了大量俄语标准(ГОСТ、СНиП、SanPiN 等)以及国家、行业和地方规范,作为设计的法规基础文件,包括: 电气设备、接线、接地、电气安全; 建筑物电气装置、照明标准; 卫生与安全相关规范等。 3. Part 02 供配电总览 从电源系统整体结构进行总览: 上级:地方电网; 工厂变电所(10kV 配电装置、变压
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值