17. 电话号码的字母组合

题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

 

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

思想:

利用数据结构中队列的“先进先出”的知识,采用实时更新队列的内容实现遍历。
步骤说明:
1.建立一个map哈希表;
2.新建一个队列;
3.将第一个字符串所对应的码表逐步进入到队列中;
4.出队操作,存储当前出队的string;
5.将此string与后一个字符串所对应的码表中每一个值相加并逐步进入到队列中;
6.最终队列中存储的即为所有情况的string

代码:

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        map<char,string>m={{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}};
        queue<string>que;
        vector<string>res;
        int Size=digits.size();
        for(int i=0;i<m[digits[0]].size();i++){
            string str;
            str.push_back(m[digits[0]][i]);
            que.push(str);  //队列添加元素用push,不是push_back
        }
        for(int i=1;i<Size;i++){
            int length=que.size();
            while(length--){
                for(int j=0;j<m[digits[i]].size();j++){
                    string tmp=que.front();
                    tmp+=m[digits[i]][j];
                    que.push(tmp);
                }
                que.pop();
            }
        }
        while(!que.empty()){  //!que.empty()-->如果que不为空返回真
            res.push_back(que.front());
            que.pop();
        }
        return res;
    }
};

 

posted @ 2020-02-01 17:51  thefatcat  阅读(141)  评论(0)    收藏  举报