【leetcode】【hard】126. Word Ladder II​​​​​​​

230 篇文章 0 订阅
14 篇文章 0 订阅

126. 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 transformed word must exist in the word list. Note that beginWord is not a transformed word.

Note:

  • Return an empty list if there is no such transformation sequence.
  • All words have the same length.
  • All words contain only lowercase alphabetic characters.
  • You may assume no duplicates in the word list.
  • You may assume beginWord and endWord are non-empty and are not the same.

Example 1:

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

Example 2:

Input:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]
Output: []
Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.

题目链接:https://leetcode-cn.com/problems/word-ladder-ii/

 

思路

延续第127题的思路,本题多了一项记录所有最短路径的要求。

最简单的方案就是先BFS算出最短长度,再DFS找出所有符合要求的路。

而下面的方法都采用了一边遍历一边记录的方案。

法一:BFS

点1:在同一层,访问过的单词不能立刻从单词表删除,因为可能还有其他路径也会访问;等同一层的所有路径结束后再删。

class Solution {
public:
    vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {
        vector<vector<string>> res;
        if(wordList.size()<=0 || beginWord==endWord 
        || find(wordList.begin(), wordList.end(), endWord)==wordList.end()) return res;
        unordered_set<string> del;
        unordered_set<string> dict(wordList.begin(), wordList.end());
        queue<vector<string>> record;
        vector<string> p{beginWord};
        record.push(p);
        int step = 1, min = INT_MAX;
        while(!record.empty()){
            if(step>min) break;
            for(auto word: del){
                dict.erase(word);
            }
            del.clear();
            int len = record.size();
            for(int j=0; j<len; ++j){
                auto tmp = record.front();
                record.pop();
                string s1 = tmp.back();
                for(int i=0; i<s1.size(); ++i){
                    string s2 = s1;
                    for(char c='a'; c<='z'; ++c){
                        if(c==s2[i]) continue;
                        s2[i] = c;
                        if(dict.count(s2)>0){
                            vector<string> newp = tmp;
                            newp.push_back(s2);
                            if(s2==endWord){ 
                                res.push_back(newp);
                                min = step;
                            }else{
                                record.push(newp);
                            }
                            del.insert(s2);
                        }
                    }
                }
            }
            ++step;
        }
        return res;
    }
};

法二:双向BFS

鉴于我还是个图小白,这个解法对我太难了。。

对这种hard题,我先会一种方法,这边挖个坑以后做图熟练了在回来填。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值