• leetcode@ [126] Word Ladder II (BFS + 层次遍历 + DFS)


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

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:

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

    For example,

    Given:
    beginWord = "hit"
    endWord = "cog"
    wordList = ["hot","dot","dog","lot","log"]

    Return

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

    Note:

    • All words have the same length.
    • All words contain only lowercase alphabetic characters.
    class Solution {
    public:
        void dfs(vector<vector<string> >& res, unordered_map<string, vector<string> >& fa, vector<string> load, string beginWord, string curWord) {
            if(curWord == beginWord) {
                reverse(load.begin(), load.end());
                res.push_back(load);
                reverse(load.begin(), load.end());
                return;
            }
            
            for(int i=0; i<fa[curWord].size(); ++i) {
                load.push_back(fa[curWord][i]);
                dfs(res, fa, load, beginWord, fa[curWord][i]);
                load.pop_back();
            }
        }
    
        vector<vector<string>> findLadders(string beginWord, string endWord, unordered_set<string> &wordList) {
            vector<vector<string> > res;
            if(beginWord.compare(endWord) == 0)  return res;
            
            wordList.insert(endWord);
            
            unordered_map<string, vector<string> > fa;
            unordered_set<string> vis;
            unordered_set<string> lev;
            unordered_set<string> next_lev;
    
            lev.insert(beginWord);
            bool found = false;
            
            while(!lev.empty() && !found) {
                if(lev.find(endWord) != lev.end())  found = true;
                
                for(auto str: lev)  vis.insert(str);
                
                for(auto str : lev) {
                    for(int i=0; i<str.length(); ++i) {
                        for(char ch = 'a'; ch <= 'z'; ++ch) {
                            if(str[i] != ch) {
                                string tmp = str;
                                tmp[i] = ch;
                                if(wordList.find(tmp) != wordList.end() && vis.find(tmp) == vis.end()) {
                                    next_lev.insert(tmp);
                                    fa[tmp].push_back(str);
                                }
                            }
                        }
                    }   
                }
                
                lev.clear();
                swap(lev, next_lev);
            }
            
            if(found) {
                vector<string> load;
                load.push_back(endWord);
                dfs(res, fa, load, beginWord, endWord);
            }
            
            return res;
        }
    };
  • 相关阅读:
    幸福婚姻的八个公式
    中国移动增值服务的现状及趋势
    移动通信与互联网融合已成为趋势
    项目管理入门
    4GMF论坛主席卢伟谈4G全球发展概况
    吴刚实践总结手机网游十大金科玉律
    项目管理五大过程组在通信工程中的运用实例
    报告称近半WAP用户低学历 学生工人上网最多
    手机杂志:成长的烦恼
    3G门户网
  • 原文地址:https://www.cnblogs.com/fu11211129/p/5281928.html
Copyright © 2020-2023  润新知