Skip to content

Latest commit

 

History

History
114 lines (90 loc) · 3.25 KB

127-word-ladder.md

File metadata and controls

114 lines (90 loc) · 3.25 KB

127. Word Ladder - 单词接龙

给定两个单词(beginWord endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

  1. 每次转换只能改变一个字母。
  2. 转换过程中的中间单词必须是字典中的单词。

说明:

  • 如果不存在这样的转换序列,返回 0。
  • 所有单词具有相同的长度。
  • 所有单词只由小写字母组成。
  • 字典中不存在重复的单词。
  • 你可以假设 beginWordendWord 是非空的,且二者不相同。

示例 1:

输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

输出: 5

解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",
     返回它的长度 5。

示例 2:

输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

输出: 0

解释: endWord "cog" 不在字典中,所以无法进行转换。

题目标签:Breadth-first Search

题目链接:LeetCode / LeetCode中国

题解

Language Runtime Memory
cpp 340 ms 1.8 MB
static auto _ = [](){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return 0;
}();

class Solution {
public:
    bool diffone(string& s1, string& s2) {
        int res = 0;
        for (int i=0; i<(int)s1.size(); ++i) {
            if (s1[i] != s2[i]) {
                if (1 < ++res) {
                    return false;
                }
            }
        }
        return res == 1;
    }
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        queue<string> Q;
        unordered_set<string> avail;
        avail.insert(wordList.begin(), wordList.end());
        int res = 0;
        Q.push(beginWord);
        avail.erase(beginWord);
        vector<string> del;
        while (!Q.empty()) {
            int n = Q.size();
            res++;
            while (n--) {
                string tmp = Q.front();
                Q.pop();
                del.clear();
                for (auto s : avail) {
                    if (diffone(s, tmp)) {
                        if (s == endWord) {
                            return res + 1;
                        }
                        Q.push(s);
                        del.push_back(s);
                    }
                }
                for (auto s : del) {
                    avail.erase(s);
                }
            }
        }
        return 0;
    }
};