【LeetCode 126】Word Ladder II

博客围绕一道题展开,题目要求每次改变一个字符,中间单词需在字典出现,输出最短路径所有方案。解题思路是先用bfs建图保存最短路径结点的父亲结点,再用dfs从最后单词开始保存路径,还提到bfs的step在每层结束后加1,并给出代码情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

和125一样的题意,每次改变一个字符,中间单词只能是字典里出现过的,要求输出最短路径的所有方案。

思路:

先用bfs建图,保存所有最短路径里的每个结点的父亲结点。
然后用dfs,从最后的单词开始,保存路径。
这里的bfs和之前的不太一样,step在每一层结束以后+1。

代码:

class Solution {
public:
    vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {
        set<string> st(wordList.begin(), wordList.end());
        map<string, int> step;
        if (!st.count(endWord)) return {};
        st.erase(beginWord);
        st.erase(endWord);
        step[beginWord] = 1;
        queue<string> que;
        que.push(beginWord);
        bool found = false;
        int stepcnt = 0;
        int len = beginWord.length();
        map<string, vector<string>> parents;
            
        while(!que.empty() && !found) {
            stepcnt++;
            for (int size=que.size(); size>0; size--) {
                string cur = que.front();
                que.pop();
                for (int j=0; j<len; ++j) {
                    string nxt = cur;
                    char ch = nxt[j];
                    for (int k=0; k<26; ++k) {
                        nxt[j] = char('a' + k);
                        if (ch == nxt[j]) continue;
                        if (nxt == endWord) {
                            found = true;
                            parents[endWord].push_back(cur);
                        }else if (step.count(nxt) && step[nxt] == stepcnt + 1) {
                            parents[nxt].push_back(cur);
                        }
                        if (st.count(nxt) == 0) continue;
                        st.erase(nxt);
                        que.push(nxt);
                        step[nxt] = step[cur] + 1;
                        parents[nxt].push_back(cur);
                    }
                }
            }
        }
        vector<vector<string> > ans;
        vector<string> path;
        path.push_back(endWord);
        dfs(endWord, beginWord, parents, path, ans);
        return ans;
    }
    
    void dfs(const string& endWord, const string& beginWord, map<string, vector<string>>& parents, vector<string>& path, vector<vector<string>>& ans) {
        if (endWord == beginWord) {
            ans.push_back(vector<string>(path.rbegin(), path.rend()));
            return;
        }
        for (auto nxtWord : parents[endWord]) {
            path.push_back(nxtWord);
            dfs(nxtWord, beginWord, parents, path, ans);
            path.pop_back();
        }
    }
};

一道题做了一下午。。。for的那里开始居然写 i < que.size(),我一定是失了智。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值