Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:

Only one letter can be changed at a time
Each intermediate word must exist in the dictionary

1.依然是BFS,记录每个的前驱节点father[x],当然这个father有多个；

2.然后用DFS遍历father,从end到start

DFS递归完注意‘恢复现场’。

`class Solution {public:    /**    * @param start, a string    * @param end, a string    * @param dict, a set of string    * @return a list of lists of string    */    void dfs(vector<vector<string>> &res,unordered_map<string,vector<string>> &father,    vector<string> &path,string &start,string &end){        path.push_back(end);        if(end==start){            vector<string> tmp(path);            reverse(tmp.begin(),tmp.end());            res.push_back(tmp);            path.pop_back();            return;        }        vector<string> fa=father[end];        for(int i=0;i<fa.size();i++){            string f=fa[i];            dfs(res,father,path,start,f);        }        path.pop_back();    }    vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {        // write your code here        vector<vector<string>> res;        /*这里需要用set而不能用vector,会使得得到相同的最短路径*/        unordered_set<string> current,next;        unordered_set<string> visited;        unordered_map<string,vector<string>> father;        current.insert(start);        bool found=false;        while (!current.empty() && !found){            for(string str:current){                visited.insert(str);            }            for (string front:current){                for (int i = 0; i < front.size(); i++){                    for (int ch = 'a'; ch <= 'z'; ch++){                        if(front[i]==ch) continue;                        string tmp = front;                        tmp[i] = ch;                        if (tmp == end){                            found=true;                        }                        if (dict.find(tmp)!=dict.end()  && visited.find(tmp)==visited.end() ){                            father[tmp].push_back(front);                            next.insert(tmp);                        }                    }                }            }            current.clear();            swap(current,next);        }        if(found){            vector<string> path;            dfs(res,father,path,start,end);        }        return res;    }};`