Leetcode-17电话号码的字母组合

回溯
当题目中出现所有组合的字眼时,就应该想到回溯

class Solution {
public:
    unordered_map<int,string> phoneMap{
            {2, "abc"},
            {3, "def"},
            {4, "ghi"},
            {5, "jkl"},
            {6, "mno"},
            {7, "pqrs"},
            {8, "tuv"},
            {9, "wxyz"}
    };

    vector<string> result;
    string s;

    vector<string> letterCombinations(string digits) {
        int len=digits.size();
        if(len==0){
            return result;//因为默认初始化一个size为0的向量
        }
        int index=0;//代表到了第几个数字
        backtrack(digits,index);
        return result;
    }

    void backtrack(string digits,int index){
        if (index == digits.size()) {//如果到了最后的数字
            result.push_back(s);//加入这个结果
            return;
        }
        int digit = digits[index]-'0';        // 将index指向的数字转为int
        string letters = phoneMap[digit];      // 取数字对应的字符集
        for (int i = 0; i < letters.size(); i++) {
            s.push_back(letters[i]);            // 处理
            backtrack(digits, index + 1);    // 递归,注意index+1,一下层要处理下一个数字了
            s.pop_back();                       // 回溯
        }
    }
};

队列
每次取出队列中的第一个元素,和对应的字符挨个拼接,依次进入队列

class Solution {
public:
    unordered_map<int,string> phoneMap{
            {2, "abc"},
            {3, "def"},
            {4, "ghi"},
            {5, "jkl"},
            {6, "mno"},
            {7, "pqrs"},
            {8, "tuv"},
            {9, "wxyz"}
    };

    vector<string> result;
    string s;

    vector<string> letterCombinations(string digits) {
        int len=digits.size();
        if(len==0){
            return result;//因为默认初始化一个size为0的向量
        }
        //先往队列中加入一个空字符,注意这个细节
        result.push_back("");
        for(int i=0;i<len;i++){
        	//取出这个数字对应的所有字母
            string letters=phoneMap[digits[i]-'0'];
            //得到当前队列中有多少元素,挨个拿出来
            int size=result.size();
            for(int j=0;j<size;j++){
            	//获得第一个元素,从队列头去除
                string temp=result[0];
                result.erase(result.begin());
                for(int k=0;k<letters.size();k++){
                	//然后跟"def"这样的字符串拼接,并再次放到队列中
                    result.push_back(temp+letters[k]);
                }
            }
        }
        return result;
    }
};

使用STL deque数据结构

class Solution {
public:
    unordered_map<int,string> phoneMap{
            {2, "abc"},
            {3, "def"},
            {4, "ghi"},
            {5, "jkl"},
            {6, "mno"},
            {7, "pqrs"},
            {8, "tuv"},
            {9, "wxyz"}
    };

    deque<string> result;
    string s;

    vector<string> letterCombinations(string digits) {
        int len=digits.size();
        if(len==0){
            return {};
        }
        result.push_back("");
        for(int i=0;i<len;i++){
            string letters=phoneMap[digits[i]-'0'];
            int size=result.size();
            for(int j=0;j<size;j++){
                string temp=result.front();
                result.pop_front();
                for(int k=0;k<letters.size();k++){
                    result.push_back(temp+letters[k]);
                }
            }
        }
        vector<string> res;
        //赋值
        res.assign(result.begin(),result.end());
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值