• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
村雨sup
自己选的路,跪着也要走完 XD
博客园    首页    新随笔    联系   管理    订阅  订阅
Leetcode 127 **
class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> wordset(wordList.begin(),wordList.end());
        wordset.erase(beginWord);
        int res = 0;
        queue<string> que{{beginWord}};
        while(!que.empty()){
            int len = que.size();
            for(int i=0;i < len;i++){//坑:int i=0;i < que.size();i++  que.size()会不停改变
                string word = que.front(); que.pop();
                if(word == endWord) return res+1;
                for(int i=0;i < word.size();i++){
                    string newword = word;
                    for(char ch = 'a';ch <= 'z';ch++){
                        newword[i] = ch;
                        if(wordset.count(newword)){
                            que.push(newword);
                            wordset.erase(newword);
                        }
                    }
                }
            }
            res++;
        }
        return 0;  //没找到
    } 
};

好题!第一次见这题还是在一年前刚学算法的时候,今日硬着头皮分析了下去,前几天写的DFS T了,我都写了DFS居然没有想到这其实是一个求图的最短跳数的题:

单词之间能够变化可以抽象为两点之间有一条有向路径,BFS找到第一个点有向路径连接的所有点加入队列,然后对队列中的点再找图中剩下直连的点,最先到达终点的距离就是层数,直接返回。

还有要把层次遍历和BFS联系起来!都是用的队列,对每“批次”的队列遍历循环,两者本质是一样的。

最后注意 que.size()的坑,之前遇到过,还好看出来了。

posted on 2019-03-21 02:13  村雨sup  阅读(117)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3