leetcode17.电话号码的数字组合(题目详解)

题目链接

思路:

先考虑只输入一个数字的情况,例如digits=“2”,只需遍历一遍“abc“即可。

for i in "abc"{
//伪代码
    push_back(i);
}

若digits=“23”,就要经历两次遍历。

//伪代码
for i in "abc"{
     for j in "def"{
           push_back(ij);
    }
}

不难发现,digits有几个数字,就有几层循环层数,但是我们的代码的循环层数又不能改变,怎么办呢?这里就可以用递归来解决,递归的深度就是digits的数字个数,递归内部再用循环来遍历每个数字对应映射的所有字母。

如下图所示:digits="234"

完整代码如下:

class Solution {
public:
    void sstr(string& digits, int i, vector<string>& ans, string& res) {
     //int i 记录的是当前的递归深度
        if (i == digits.size()) return;//递归结束条件
        static vector<string>v1 = { " ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
        for (int j = 0; j < v1[digits[i] - '0'].size(); ++j) {
   //循环来遍历每个数字对应映射的所有字母。
            res[i] = v1[digits[i] - '0'][j];
            sstr(digits, i + 1, ans, res);
            if (i == digits.size() - 1) {
            //每次递归到最底层,将res存到vector里
                ans.push_back(res);
            }
        }
    }

    vector<string> letterCombinations(string digits) {
        vector<string>  ans;
        string res(digits.size(), 'x');
//先将res的空间预留出来,随便用一个字母填充,反正后面都会被覆盖掉,这里先用‘x’填充
    //res用来临时存每次的字母组合
        sstr(digits, 0, ans, res);
        return ans;
    }
};

那么本期内容就到这里了,觉得有收获的同学们可以给个点赞、关注、收藏哦,谢谢大家。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值