LeetCode 127.单词接龙

字典 wordList 中从单词 beginWordendWord 的转换序列是一个按下述规格形成的序列:
beginWord -> s1 -> s2 -> … -> sk:
1.每一对相邻的单词只差一个字母。
2.对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
3.sk == endWord
给你两个单词 beginWordendWord 和一个字典 wordList ,返回从 beginWordendWord 的 最短转换序列中的单词数目 。如果不存在这样的转换序列,返回0 。
LeetCode 127.单词接龙_第1张图片
题目中的单词序列,相邻单词之间只隔一个字母,单词和单词之间的距离为1。wordList里的单词只能使用一次,如果使用多次一定形成环路,距离变长,需要用到集合容器。

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string>   dict(wordList.begin(),wordList.end());
        if(!dict.count(endWord))    return 0;

        queue<string>   q;
        q.push(beginWord);
        int level =1;
        int len=beginWord.size();

        while(!q.empty()){
            int size=q.size();//统计队列中同一层单词个数
            for(int i=0;i<size;i++){//取第level层的所有单词
                string newWord=q.front();
                q.pop();
                for(int j=0;j<len;j++){//每次取某单词的第j个字母变换
                    char originalChar=newWord[j];
                    for(char c='a';c<='z';c++){
                        if(originalChar==c) continue;//1.未变换
                        newWord[j]=c;
                        if(newWord==endWord)    return level+1;//2.变换后找到目标
                        if(!dict.count(newWord))    continue;//3.变换后不在字典中
                        dict.erase(newWord);//4.变换后在字典中
                        q.push(newWord);
                    }
                    newWord[j]=originalChar;//对单词的第j个字母进行还原
                }
            }
            level++;
        }
        return 0;
    }
};

你可能感兴趣的:(leetcode)