【筆試練習題】leetcode127. Word Ladder(廣度優先遍歷)

這是leetcode上第127題。給出原單詞和目標單詞和一個字典,在字典中找到過渡單詞,使得原單詞可以變爲目標單詞。

要求:一次只變一個字母。

輸出爲:最短變化路徑的長度。

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& 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<string> q;
        q.push(beginWord);
        int cnt = 2;         
        list<string> 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<string>::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<string>& wordList){
        vector<string>::iterator it = wordList.begin();
        it = find(wordList.begin(), wordList.end(), endWord);
        if(it == wordList.end()){
            return false;
        }
        else{
            return true;
        }
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章