https://oj.leetcode.com/problems/word-ladder-ii/

啊,终于过了

class Solution {
public:
vector<vector<string> > findLadders(string start, string end, unordered_set<string> &dict) {
vector<vector<string> > ans; if(start.size() == || end.size() == || dict.size() == )
return ans; if(start == end)
{
vector<string> piece;
piece.push_back(start);
ans.push_back(piece);
return ans;
} unordered_map<string, vector<string> > parents; unordered_set<string> current;
current.insert(start);
dict.erase(start); unordered_set<string> next;
bool flagFind = false;
vector<string> lastOnes; // 记录最后一个变换的string
int depth = ; // 记录深度 while(current.size() != && flagFind == false) // flagFind 标记是否已经找到
{
depth++;
// 对于本层的每一个单词
unordered_set<string>::iterator itr;
for(itr = current.begin(); itr != current.end(); itr++)
{
// 对于本单词的每一个位置
for(int index = ; index < start.size(); index++)
{
// 替换成 a~z,并且不等于原单词,并且在dict中存在
for(char ch = 'a'; ch <= 'z'; ch++)
{
string newStr = *itr;
if(newStr[index] != ch) // 换了以后不是原来的那个
{
newStr[index] = ch;
if(newStr == end)
{
lastOnes.push_back( *itr);
flagFind = true;
}
}
else
continue; // 如果变换后在 dict 里面
if(dict.find(newStr) != dict.end())
{
next.insert(newStr);
// record parents
parents[newStr].push_back( *itr);
}
}
}
}
// remove all next strings from dict
for(itr = next.begin(); itr != next.end(); itr++)
dict.erase(*itr); current = next;
next.clear();
}
if(flagFind == true)
{
vector<string> ansPiece;
ansPiece.push_back(end);
buildPath(ans,lastOnes,ansPiece,parents,depth);
}
return ans;
}
void buildPath(vector<vector<string> > &ans,vector<string> &lastOnes, vector<string> &ansPiece, unordered_map<string,vector<string> > &parents,int depth)
{
depth--;
for(int i = ; i < lastOnes.size(); i++)
{
ansPiece.push_back(lastOnes[i]);
if(depth == )
{
vector<string> temp = ansPiece;
reverse(temp.begin(),temp.end());
ans.push_back(temp);
}
else
{
buildPath(ans,parents[lastOnes[i]],ansPiece,parents,depth);
}
ansPiece.pop_back();
}
}
};

最新文章

  1. MyBatis 一级缓存与二级缓存
  2. Jquery 点击按钮将其背景图换成另一张,再次点击恢复默认图片
  3. 关于scrollWidth,clientWidth,offsetWidth
  4. Cheatsheet: 2015 06.01 ~ 06.30
  5. hdu 4381(背包变形)
  6. Java Concurrency - invokeAny &amp; invokeAll
  7. ubuntu 安装软件(apt源)
  8. Android Fragment详解(四):管理Fragment
  9. GreenDao教程1
  10. Caused by: java.lang.ClassNotFoundException: com.mchange.v2.ser.Indirector
  11. odoo 数据库到期提醒
  12. 好用的shell可以事半功倍
  13. 强迫症犯了,忍不住赞一下slf4j包Logger.java的优雅代码
  14. proc:基本数据库操作
  15. Java IO笔记
  16. 做了一个可定制的英文记忆字典 - RDict
  17. Leetcode 94
  18. 006PHP文件处理—— 目录操作 删除目录 删除置顶类型文件
  19. Java开发工程师(Web方向) - 04.Spring框架 - 第1章.Spring概述
  20. Snapdragon connect to android devices

热门文章

  1. [ActionScript 3.0] AS3.0 将图像的Alpha通道转换为黑白图像(分离ARGB方式)
  2. SeedDms 文档管理系统安装
  3. QBC分页查询
  4. selenium2 WebDriver 在asp.net项目中的应用
  5. 在c中保存状态
  6. Linux:永久修改网卡的MAC地址
  7. angular 的ng-view,ngrouter
  8. mysql小误区关于set global sql_slave_skip_counter=N命令
  9. {CSDN}{英雄会}{火车调度}
  10. JavaWeb总结--Servlet 工作原理解析