zoukankan      html  css  js  c++  java
  • 30 Day Challenge Day 17 | Leetcode 127. Word Ladder

    题解

    Medium

    方法:BFS

    class Solution {
    public:
        int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
            int steps = 0;
            
            unordered_set<string> dict(wordList.begin(), wordList.end());
            
            if(!dict.count(endWord)) return 0;
            
            queue<string> q;
            q.push(beginWord);
            
            while(!q.empty()) {
                steps++;
                int sz = q.size();
                for(int i = 0; i < sz; i++) {
                    string t = q.front();
                    q.pop();
                    
                    for(int k = 0; k < t.size(); k++) {
                        char ch = t[k];
                        for(int c = 'a'; c <= 'z'; c++) {
                            t[k] = c;
                            if(t == endWord) return steps+1;
                            if(dict.count(t)) {
                                dict.erase(t);
                                q.push(t);
                            }
                            t[k] = ch;
                        }
                    }
                }
            }
            
            return 0;
        }
    };
    

    方法:Bi-directional BFS

    更进一步,可以用双向广度优先搜索。也就是用两个队列,分别从两端相互靠拢。

    这里用 unordered_set 代替 queue 是考虑到后面用查找比较方便。

    两条队列,每次处理较短的那条,也是一种节省时间的办法。

    class Solution {
    public:
        int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
            int steps = 0;
            
            unordered_set<string> dict(wordList.begin(), wordList.end());
            
            if(!dict.count(endWord)) return 0;
            
            unordered_set<string> q1, q2;
            q1.insert(beginWord);
            q2.insert(endWord);
            
            while(!q1.empty() && !q2.empty()) {
                steps++;
                
                if(q1.size() > q2.size()) {
                    swap(q1, q2);
                }
                
                unordered_set<string> q;
                
                for(auto next : q1) {
                    for(int k = 0; k < next.size(); k++) {
                        char ch = next[k];
                        for(int c = 'a'; c <= 'z'; c++) {
                            next[k] = c;
                            if(q2.count(next)) return steps+1;
                            if(dict.count(next)) {
                                dict.erase(next);
                                q.insert(next);
                            }
                            next[k] = ch;
                        }
                    }
                }
                
                swap(q1, q);
            }
            
            return 0;
        }
    };
    
  • 相关阅读:
    SQL 查询当前时间
    request,reponse对象中的方法
    如何在JSP中获得Cookie对象
    JSP的执行原理
    ModelState查看错误字段的信息
    sql privot 实现行转列
    设计模式
    mvc未登录跳转到登录界面
    log4net
    IoC, DI,Spring.net
  • 原文地址:https://www.cnblogs.com/casperwin/p/13760334.html
Copyright © 2011-2022 走看看