博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】Word Ladder II(hard)★ 图 回头看
阅读量:6300 次
发布时间:2019-06-22

本文共 3583 字,大约阅读时间需要 11 分钟。

Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:

start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

Return

[    ["hit","hot","dot","dog","cog"],    ["hit","hot","lot","log","cog"]  ]

 

思路:

我自己用回溯做,结果超时了。代码和注释如下: 很长

#include 
#include
#include
#include
#include
#include
#include
using namespace std;class Solution {public: vector
> findLadders(string start, string end, unordered_set
&dict) { vector
> ans; vector
hash; //记录单词是否已经生成 vector
X; vector
> S; vector
hashlength; //记录在k = 0 - ... 时 hash 的长度 方便弹出 int minlen = 1000; int k = 0; hash.push_back(start); hashlength.push_back(1); if(S.size() <= k) { S.push_back(vector
()); } S[k].push_back(start); while(k >= 0) { while(!S[k].empty()) { X.push_back(S[k].back()); S[k].pop_back(); if(onedifferent(X.back(), end)) { X.push_back(end); if(k == minlen) //只存长度最短的 { ans.push_back(X); } if(k < minlen) //如果有新的最短长度 ans清空,压入新的最短答案 { minlen = k; ans.clear(); ans.push_back(X); } } else if(k < minlen) //k如果>= minlen 那么后面的结果肯定大于最短长度 { k++; if(S.size() <= k) //如果S的长度不够 扩大S长度 { S.push_back(vector
()); } if(hashlength.size() <= k)//如果hashlength的长度不够 扩大其长度 { hashlength.push_back(0); } unordered_set
::iterator it; for(it = dict.begin(); it != dict.end(); it++) //对字典中的数字遍历,得到下一个长度可以用的备选项 { if(onedifferent(X.back(), *it) && (find(hash.begin(), hash.end(), *it) == hash.end())) { hashlength[k]++; hash.push_back(*it); S[k].push_back(*it); } } } } k--; while(k >= 0 && hashlength[k]) //把当前层压入hash的值都弹出 { hash.pop_back(); hashlength[k]--; } while(k >= 0 && X.size() > k) //把当前层压入X的值弹出 { X.pop_back(); } } return ans; } bool onedifferent(string s1, string s2) //判断s1是否可以只交换一次得到s2 { int diff = 0; for(int i = 0; i < s1.size(); i++) { if(s1[i] != s2[i]) diff++; } return (diff == 1); } };int main(){ Solution s; unordered_set
dict; dict.insert("hot"); dict.insert("dot"); dict.insert("dog"); dict.insert("lot"); dict.insert("log"); string start = "hit"; string end = "cog"; vector
> ans = s.findLadders(start, end, dict); return 0;}

 

别人的思路:我没怎么看,只知道是用图的思想 速度也不快 差不多1000ms的样子

class Solution {public:    vector
> helper(unordered_map
> &pre,string s,unordered_map
&visit,string start){ vector
> ret,ret1;vector
t_ret; if(s==start) {t_ret.push_back(s);ret.push_back(t_ret);return ret;} for ( auto it = pre[s].begin(); it != pre[s].end(); ++it ){ ret1=helper(pre,*it,visit,start); for(int i=0;i
> findLadders(string start, string end, unordered_set
&dict) { unordered_map
> graph;unordered_map
visit;unordered_map
> pre; vector
> ret; vector
t_ret; if(start==end){t_ret.push_back(start);t_ret.push_back(end);ret.push_back(t_ret);return ret;} dict.insert(start);dict.insert(end); for ( auto it = dict.begin(); it != dict.end(); ++it ){ string t=*it; visit[t]=0; for(int i=0;i
0) graph[t].push_back(tt); } } queue
myq; myq.push(start); while(!myq.empty()){ for(int i=0;i
0&&visit[graph[myq.front()][i]]>=visit[myq.front()]+1){ if(visit[graph[myq.front()][i]]>visit[myq.front()]+1){ visit[graph[myq.front()][i]]=visit[myq.front()]+1; pre[graph[myq.front()][i]].push_back(myq.front()); }else pre[graph[myq.front()][i]].push_back(myq.front());; } } visit[start]=1; myq.pop(); } if(visit[end]==0) return ret; ret=helper(pre,end,visit,start); return ret; }};

 

转载地址:http://augta.baihongyu.com/

你可能感兴趣的文章
存储产业进入闪存时代—2016中国闪存峰会在京召开
查看>>
Spring+SpringMVC+Hibernate简单整合(转)
查看>>
Zulip 2.0.3 发布,功能强大的群组聊天软件
查看>>
Maven更新POM中的JDK版本(比如更新为JDK1.8)
查看>>
笨办法学 Python · 续 第七部分:大作业
查看>>
区块链应用 | 不要否认区块链十年来的进展,它已经改变了很多事情
查看>>
沃•云总机以互联网+SaaS模式助力河南房产行业信息化
查看>>
数据结构思维 第七章 到达哲学
查看>>
MAC上快速调出终端的设置(保持和Windows的操作一致)
查看>>
SQL更新id段之间的字段
查看>>
阿里云ECS,突发性能实例t5购买参考和使用建议
查看>>
.NET轻量级ORM框架Dapper入门精通
查看>>
量子卫星是何物?快戳进来涨姿势!
查看>>
AI诊断又有新算法,让人们提前10年知道自己是否会老年痴呆
查看>>
商用无人机被“锁”住了螺旋桨,送货机器人却已经开始满地跑了
查看>>
凯迪生态携手海通安恒,成功启动SAP实施项目
查看>>
Java的对象和类
查看>>
格式化字符串漏洞利用 一、引言
查看>>
Oracle NetSuite推出全球首款智能云套件
查看>>
软件项目进度控制表(自制)
查看>>