本文共 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/