博客
关于我
126. 单词接龙 II
阅读量:562 次
发布时间:2019-03-09

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

给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:

每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。

说明:

如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。

示例 1:

输入:

beginWord = “hit”,
endWord = “cog”,
wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]

输出:

[
[“hit”,“hot”,“dot”,“dog”,“cog”],
[“hit”,“hot”,“lot”,“log”,“cog”]
]
我的代码 超时

static int y=[](){    std::ios::sync_with_stdio(false);    cin.tie(NULL);    return 0;}();vector
> v_e;vector
> v_solution;vector
x;string bWord;string eWord;int n;int min_len;int compare(string endWord,string wordLi){ int num=0; for(int i=0;i
& words){ for(int i=0;i
& words,int len){ if(len+t>min_len) return; if(t==0) { if(min_len>len) min_len=len; vector
temp; temp.push_back(bWord); for(int i=0;i
min_len) return; for(int i=0;i
> findLadders(string beginWord, string endWord, vector
& wordList) { bWord=beginWord; min_len=wordList.size(); eWord=endWord; int len=beginWord.size(); n=compare(endWord,beginWord); vector
>().swap(v_solution); vector
().swap(x); vector
>().swap(v_e); v_e.resize(len+1); vector
> v_find; for(int i=0;i

最短代码 820 ms 178.6 MB

class Solution {public:    vector
> findLadders(string beginWord, string endWord, vector
& wordList) { vector
> res; unordered_set
dict(wordList.begin(), wordList.end()); vector
p{beginWord}; queue
> paths; paths.push(p); int level = 1, minLevel = INT_MAX; unordered_set
words; while (!paths.empty()) { auto t = paths.front(); paths.pop(); if (t.size() > level) { for (string w : words) dict.erase(w); words.clear(); level = t.size(); if (level > minLevel) break; } string last = t.back(); for (int i = 0; i < last.size(); ++i) { string newLast = last; for (char ch = 'a'; ch <= 'z'; ++ch) { newLast[i] = ch; if (!dict.count(newLast)) continue; words.insert(newLast); vector
nextPath = t; nextPath.push_back(newLast); if (newLast == endWord) { res.push_back(nextPath); minLevel = level; } else paths.push(nextPath); } } } return res; }};

最快代码 48 ms 17.4 MB

class Solution {public:    vector
> findLadders(string beginWord, string endWord, vector
& wordList) { int N = beginWord.size(); vector
> ret; wordList.push_back(beginWord); vector
> link(wordList.size()); unordered_map
word2id; for (int i = 0; i < wordList.size(); ++i){ word2id[wordList[i]] = i; } if (word2id.count(endWord) == 0) return ret; int startId = wordList.size() - 1; int endId = word2id[endWord]; vector
visited(wordList.size(), false); unordered_set
a, b; a.insert(startId); b.insert(endId); visited[startId] = true; visited[endId] = true; while (!a.empty() && !b.empty() && ret.empty()){ unordered_set
tmp; if (a.size() > b.size()){ swap(a, b); } for (int x : a){ string w = wordList[x]; for (int i = 0; i < N; ++i){ char t = w[i]; for (char c = 'a'; c <= 'z'; ++c){ w[i] = c; auto it = word2id.find(w); if (t == c || it == word2id.end()) continue; if (b.count(it->second)){ build(x, it->second, link, wordList, ret); } else if (!visited[it->second]){ tmp.insert(it->second); link[it->second].insert(x); } } w[i] = t; } } for (int i : tmp){ visited[i] = true; } swap(tmp, a); } return ret; } void build(int x, int y, vector
>& link, vector
& wordList, vector
>& ret){ vector
> left, right; vector
vec = { x }; dfs(vec, link, left); vec[0] = y; dfs(vec, link, right); for (auto& v1 : left){ for (auto& v2 : right){ ret.push_back({}); vector
& r = ret.back(); for (int i = v1.size() - 1; i >= 0; --i){ r.push_back(wordList[v1[i]]); } for (int i = 0; i < v2.size(); ++i){ r.push_back(wordList[v2[i]]); } if (v1.back() != wordList.size() - 1){ reverse(r.begin(), r.end()); } } } } void dfs(vector
& vec, vector
>& link, vector
>& ret){ int i = vec.back(); if (link[i].empty()){ ret.push_back(vec); } else{ for (int j : link[i]){ vec.push_back(j); dfs(vec, link, ret); vec.pop_back(); } } }};

我的代码 188ms

static int x=[](){    std::ios::sync_with_stdio(false);    cin.tie(NULL);    return 0;}();class Solution {public:    string alphabet = "abcdefghijklmnopqrstuvwxyz";	vector
> solution; //unordered_map
> m_neighbourhood; unordered_set
m_list; unordered_map
> m_pre; unordered_map
> m_after; unordered_set
m_use_pre; unordered_set
m_use_after; vector
stemp; set
temp; queue
q_pre; queue
q_after; //unordered_map
m_index; bool isok = false; void dfs(unordered_map
>&m, vector
>&v_pre, vector
v, string s, string end){ if (s == end) { v_pre.push_back(v); return; } for (string t : m[s]) { v.insert(v.begin(), t); dfs(m, v_pre, v, t, end); v.erase(v.begin()); }}void deal(string beginWord, string endWord){ for (string k : temp) { vector
v; vector
>pre; vector
>after; dfs(m_pre, pre, v, k, beginWord); dfs(m_after, after, v, k, endWord); for (auto m : pre) { for (auto n : after) { vector
t_m = m; t_m.push_back(k); for (int h = n.size() - 1; h >= 0; h--) t_m.push_back(n[h]); solution.push_back(t_m); } } }}vector
> findLadders(string beginWord, string endWord, vector
& wordList){ int pre, after; for (int i = 0; i
temp_s; a++; int temp_pre = 0; for (int t = 0; t

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

你可能感兴趣的文章
MySQL-Buffer的应用
查看>>
mysql-cluster 安装篇(1)---简介
查看>>
mysql-connector-java.jar乱码,最新版mysql-connector-java-8.0.15.jar,如何愉快的进行JDBC操作...
查看>>
mysql-connector-java各种版本下载地址
查看>>
mysql-EXPLAIN
查看>>
MySQL-Explain的详解
查看>>
mysql-group_concat
查看>>
MySQL-redo日志
查看>>
MySQL-【1】配置
查看>>
MySQL-【4】基本操作
查看>>
Mysql-丢失更新
查看>>
Mysql-事务阻塞
查看>>
Mysql-存储引擎
查看>>
mysql-开启慢查询&所有操作记录日志
查看>>
MySQL-数据目录
查看>>
MySQL-数据页的结构
查看>>
MySQL-架构篇
查看>>
MySQL-索引的分类(聚簇索引、二级索引、联合索引)
查看>>
Mysql-触发器及创建触发器失败原因
查看>>
MySQL-连接
查看>>