zoukankan      html  css  js  c++  java
  • LeetCode Word Ladder II

    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"]
      ]
    

    Note:

    • All words have the same length.
    • All words contain only lowercase alphabetic characters.
    class Solution {
    private:
        vector<vector<string>> res;
    public:
        vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
            res.clear();
            
            unordered_map<string, vector<string> > paths;
            
            queue<string> que;
            
            que.push(start);
            dict.insert(end);
            
            vector<string> del;
            del.push_back(start);
            
            while (!que.empty()) {
                int size = que.size();
                
                for (string& s : del) {
                    dict.erase(s);
                }
                
                del.clear();
                
                for (int i=0; i<size; i++) {
                
                    string str = que.front();
                    string orig = str;
                    que.pop();
                
                    if (str == end) {
                        continue;
                    }
                    for (char& ch : str) {
                        for (char c = 'a'; c <= 'z'; c++) {
                            if (ch == c) {
                                continue;
                            }
                            char t = ch;
                            ch = c;
                        
                            if (dict.count(str) > 0) {
                                del.push_back(str);
                                que.push(str);
                            
                                if (paths.count(str) == 0) {
                                    paths.insert(make_pair(str, vector<string>()));
                                }
                                paths[str].push_back(orig);
                            }
                            ch = t;
                        }
                    }
                }
            }
            vector<string> path;
            path.push_back(end);
            build_path(paths, path, end);
            return res;
        }
        
        void build_path(unordered_map<string, vector<string> > paths, vector<string>& path, string prev) {
            if (paths.count(prev) == 0) {
                if (path.size() < 2) return;
                reverse(path.begin(), path.end());
                res.push_back(path);
                return;
            }
            
            vector<string>& strs = paths[prev];
            for (string& s : strs) {
                path.push_back(s);
                build_path(paths, path, s);
                path.pop_back();
            }
        }
    };

    TLE

  • 相关阅读:
    [UVa514] Rails
    今日才真正懂了BFS
    [UVa11292] Dragon of Loowater
    [UVa] TEX Quotes
    白书杂七杂八
    [OpenJudge] Feed_Accounting
    [OpenJudge] Jolly_Jumpers
    Restart
    Collection of Websites
    Oracle11完全卸载方法
  • 原文地址:https://www.cnblogs.com/lailailai/p/4574477.html
Copyright © 2011-2022 走看看