class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param start string字符串 
     * @param end string字符串 
     * @param bank string字符串vector 
     * @return int整型
     */
    bool check(string str_1, string str_2)
    {
        int res = 0;
        for(int i=0; i<str_1.size(); ++i)
        {
            if(str_1[i]!=str_2[i])
                ++res;

            if(res>1)
                return false;
        }

        return res==1;
    }

    int minMutation(string start, string end, vector<string>& bank) {
        // write code here
        // 这不是跟 NB8 牛群最短移动序列 差不多吗,这就是简单题了?字符串长度倒是固定8个字符
        // 哈希表+广度优先搜索

        unordered_set<string> u_s(bank.begin(),bank.end());
        if(u_s.count(end)==0)
            return -1;
        if(u_s.count(start))
            u_s.erase(start);

        queue<string> q;
        q.emplace(start);
        int ans = -1;

        while(!q.empty())
        {
            ++ans;
            int len = q.size();
            for(int i=0; i<len; ++i)
            {
                string str = q.front();
                q.pop();

                if(str==end)
                    return ans;

                for(auto it=u_s.begin(); it!=u_s.end(); )
                {
                    if(check(str,*it))
                    {
                        q.emplace(*it);
                        it=u_s.erase(it);
                    }
                    else
                        ++it;
                }
            }
        }

        return -1;
    }
};