博客
关于我
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 order by与limit混用陷阱
查看>>
Mysql order by与limit混用陷阱
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
mysql replace用法
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql server has gone away
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
MYSQL sql语句针对数据记录时间范围查询的效率对比
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
mysql union orderby 无效
查看>>
mysql v$session_Oracle 进程查看v$session
查看>>