知识点

哈希表 BFS

思路

这是一个从beginWord到endWord的最短路问题,由于每次权重为1,所以可以用bfs解决。

bfs很容易搜索空间爆炸,但是本题要求搜索的每个节点必须出现过,所以状态数最多有2000个。

所以我们可以用哈希表存储所有的允许的字符串,每次用O(1)的时间得到是否存在该元素(实际上如果key是string的话会和字符串长度正比)

每次转移我们枚举把某个字母转换成哪一个小写字母即可,每次最多考虑16*26次

时间复杂度为O(26nm) n是合法字符串的数目,m是字符串的长度,由于哈希表判断,实际的时间复杂度是O(26nm^2)

AC Code (C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param beginWord string字符串 
     * @param endWord string字符串 
     * @param wordList string字符串vector 
     * @return int整型
     */
    using psi = pair<string, int>;
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        // bfs最短路
        unordered_set<string> S(wordList.begin(), wordList.end());
        queue<psi> q;
        q.emplace(beginWord, 1);
        S.erase(beginWord);
        while (!q.empty()) {
            auto [s, step] = q.front();
            q.pop();
            for (int i = 0; i < s.size(); i ++) {
                for (char c = 'a'; c <= 'z'; c ++) {
                    if (s[i] == c) continue;
                    auto t = s[i];
                    s[i] = c;
                    if (S.count(s)) {
                        if (s == endWord) return step + 1;
                        S.erase(s);
                        q.emplace(s, step + 1);
                    }
                    s[i] = t;
                }
            }
        }
        return 0;
    }
};