【笔试练习题】leetcode127. Word Ladder(广度优先遍历)

这是leetcode上第127题。给出原单词和目标单词和一个字典,在字典中找到过渡单词,使得原单词可以变为目标单词。

要求:一次只变一个字母。

输出为:最短变化路径的长度。

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector& wordList) {
        if(beginWord.size() != endWord.size())
            return 0;
        if(beginWord == endWord)
            return 1;
        if(!is_in_step(endWord, wordList)) // 如果目标不在wordList中,返回0
            return 0;
        
        int step_size = 0;
        queue q;
        q.push(beginWord);
        int cnt = 2;         
        list strList(wordList.begin(), wordList.end()); // 将wordList放入链表中便于操作       
        while(!q.empty())
        {
            // 层序遍历
            int qsize = q.size();
            for(int ii = 0; ii < qsize; ii++)
            {
                string s1 = q.front();
                q.pop();
                for(list::iterator it = strList.begin(); it != strList.end(); )
                {
                    // 判断strList中的词是否与可以通过s1一步变化得到。
                    if(is_step(s1, *it)){
                        // 如果可以,则判断是否为目标单词
                        if(*it == endWord){
                            return cnt; // 如果是目标单词,则返回
                        }
                        else{
                            // 如果不是目标单词,加入队列,并将之从列表中删除
                            q.push(*it); 
                            it = strList.erase(it);
                        }
                    }
                    else ++it;
                }
            }
            cnt++;
        }
        return 0;
    }
private:
    // 判断s1是否可以经过一步变化变成s2
    bool is_step(string s1, string s2)
    {
        if(s1.size() != s2.size())
            return false;
        int diff_cnt = 0;
        for(int i = 0; i < s1.size(); i++){
            if(s1[i] != s2[i])
            {
                diff_cnt++;
                if(diff_cnt > 1){
                    return false;
                }
            }
        }
        if(diff_cnt == 0)
            return false;
        return true;
    }
    // 判断endWord是否在wordList中
    bool is_in_step(string endWord, vector& wordList){
        vector::iterator it = wordList.begin();
        it = find(wordList.begin(), wordList.end(), endWord);
        if(it == wordList.end()){
            return false;
        }
        else{
            return true;
        }
    }
};

 

你可能感兴趣的:(c++学习笔记,笔试题)