zoukankan      html  css  js  c++  java
  • leetcode 127. Word Ladder、126. Word Ladder II

    127. Word Ladder

    这道题使用bfs来解决,每次将满足要求的变换单词加入队列中。

    wordSet用来记录当前词典中的单词,做一个单词变换生成一个新单词,都需要判断这个单词是否在词典中,不在词典中就不能加入队列。

    pathCnt用来记录遍历到的某一个词使用的次数,做一个单词变换生成一个新单词,都需要判断这个单词是否在pathCnt中,如果在,则说明之前已经达到过,这次不用再计算了,因为这次计算的path肯定比之前多。pathCnt相当于剪枝。

    class Solution {
    public:
        int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
            unordered_set wordSet(wordList.begin(),wordList.end());
            if(!wordSet.count(endWord))
                return 0;
            unordered_map<string,int> pathCnt;
            queue<string> q;
            q.push(beginWord);
            pathCnt[beginWord] = 1;
            while(!q.empty()){
                string word = q.front();
                q.pop();
                for(int i = 0;i < word.size();i++){
                    string newWord = word;
                    for(char j = 'a';j <= 'z';j++){
                        newWord[i] = j;
                        if(newWord == endWord)
                            return pathCnt[word] + 1;
                        if(wordSet.count(newWord) && !pathCnt.count(newWord)){
                            q.push(newWord);
                            pathCnt[newWord] = pathCnt[word] + 1;
                        }
                    }
                }
            }
            return 0;
        }
    };

    126. Word Ladder II

    https://www.cnblogs.com/grandyang/p/4548184.html

    class Solution {
    public:
        vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {
            vector<vector<string>> res;
            unordered_set<string> dict(wordList.begin(), wordList.end());
            vector<string> p{beginWord};
            queue<vector<string>> paths;
            paths.push(p);
            int level = 1, minLevel = INT_MAX;
            unordered_set<string> words;
            while (!paths.empty()) {
                auto t = paths.front(); paths.pop();
                if (t.size() > level) {
                    for (string w : words) dict.erase(w);
                    words.clear();
                    level = t.size();
                    if (level > minLevel) break;
                }
                string last = t.back();
                for (int i = 0; i < last.size(); ++i) {
                    string newLast = last;
                    for (char ch = 'a'; ch <= 'z'; ++ch) {
                        newLast[i] = ch;
                        if (!dict.count(newLast)) continue;
                        words.insert(newLast);
                        vector<string> nextPath = t;
                        nextPath.push_back(newLast);
                        if (newLast == endWord) {
                            res.push_back(nextPath);
                            minLevel = level;
                        } else paths.push(nextPath);
                    }
                }
            }
            return res;
        }
    };
  • 相关阅读:
    关于线程的执行顺序
    常用正则表达式
    @JsonFormat与@DateTimeFormat注解的使用
    Mybatis中 #{} 和 ${} 的区别!
    [Redis]Spring Boot 中 Redis 的使用
    [WebSocket长连接]SpringBoot2.0集成WebSocket,实现后台向前端推送信息
    [springboot] 搭建项目及单元测试
    [AOP拦截 ]SpringBoot+Quartz Aop拦截Job类中的方法
    [vue折线图] 记录SpringBoot+Vue3.0折线图订单信息展示
    SpringBoot解决cors跨域问题
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10698876.html
Copyright © 2011-2022 走看看