【筆記試験練習問題】leetcode 127.Word Ladder(広さ優先遍歴)


これはleetcodeの127番目の問題です.元の単語とターゲットの単語と辞書を与えて、辞書の中で遷移単語を見つけて、元の単語がターゲットの単語になることができます.
要求:一度に1文字だけ変更します.
出力は:最短変化パスの長さです.
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;
        }
    }
};