LeetCode -- 127. 单词接龙

发布时间 2023-08-09 09:14:16作者: 深渊之巅

 

方法一:双向广搜

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        set<string> se;
        for(auto it : wordList) {
            se.insert(it);
        }

        if(!se.count(endWord)) return 0;

        auto update = [&](queue<string> &q, unordered_map<string, int> &cur, unordered_map<string, int> &other) -> int {
            int m = q.size();
            while(m -- ) {
                string t = q.front();
                q.pop();
                int n = t.size();
                for(int i = 0; i < n; i ++ ) {
                    for(int j = 0; j < 26; j ++ ) {
                        string sub = t;
                        sub[i] = 'a' + j;
                        if(se.count(sub)) {
                            if(cur.count(sub)) continue;
                            if(other.count(sub)) {
                                return cur[t] + other[sub] + 1;
                            } else {
                                q.push(sub);
                                cur[sub] = cur[t] + 1;
                            }
                        }
                    }
                }
            }
            return -1;
        };

        auto bfs = [&]() -> int {
            queue<string> q1, q2;
            unordered_map<string, int> m1, m2;
            q1.push(beginWord);
            m1[beginWord] = 0;
            q2.push(endWord);
            m2[endWord] = 0;

            while(q1.size() && q2.size()) {
                int t = -1;
                if(q1.size() <= q2.size()) {  //注意这里等于号不能少,确保第一次若两个相等从起点开始搜索
                    t = update(q1, m1, m2);
                } else {
                    t = update(q2, m2, m1);
                }
                if(t != -1) return t;
            }
            return -1;
        };

        int res = bfs();
        return res == -1 ? 0: res + 1;
    }
};