#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param num string字符串
     * @return string字符串vector
     */

    //输入数字获取对应的字符串
    string numberInt(int num) {
        switch (num) {
            case 2:
                return  "abc";
            case 3:
                return  "def";
            case 4:
                return  "ghi";
            case 5:
                return  "jkl";
            case 6:
                return  "mno";
            case 7:
                return  "pqrs";
            case 8:
                return  "tuv";
            case 9:
                return  "wxyz";
        }
        return  "";
    }

    vector<string> phoneNumber(string num) {
        // write code here
        int size = num.size();
        vector<string> res;
        queue<string> que;

        for (int i = 0; i < size; i++) {
            //接受当前输入数字对应的字符串
            string temp = numberInt(num[i] - '0');

            if (i == 0) { // i=0,初始化队列
                for (int j = 0; j < temp.size(); j++) {
                    que.push(string{temp[j]});
                }
            } else {  // 进行bfs
                int quesize = que.size();
                for (int i = 0; i < quesize; i++) {
                    string front = que.front();
                    for (int j = 0; j < temp.size(); j++) {
                        //记得进行一次回溯
                        front.push_back(temp[j]);
                        que.push(front);
                        front.pop_back();
                    }
                    que.pop();
                }
            }
        }

        //结果输入到res中即可
        while (!que.empty()) {
            res.push_back(que.front());
            que.pop();
        }
        return res;
    }
};