leecode做题笔记17————电话号码的字母组合

题目如下所示:

一开始的想法是通过循环遍历算法,但是每次循环的次数,由于每个数字包含的字母并不相同,所以会很麻烦。于是想到了使用递归的思想,但是由于本身递归算法使用的不够熟练,所以并没有写出成功的代码,参考了题解中一位大哥的代码。

这个里面我需要认识到的是,所谓递归就是很多循环,那么本题的思路就是将每个循环中的字符单独相加。参考代码如下,更好理解:

class Solution {
public:
    vector<string> ans; // 设为全局变量,方便helper函数引用
    vector<string> sList={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; //字符表,注意不能用括号声明
    
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0) return {};  // 特判
        helper(digits, {}, 0);
        return ans;
    }

    void helper(string digits, string s, int idx){
        if(idx==digits.size()){ // 回溯条件,保证digits全部被扫描
            ans.push_back(s);   // 将一种结果压入ans
            return;
        }
        else{
            // 依据digits的位数进行迭代,例如digits="234"
            // 第一层迭代为"2",将遍历对应的字符串"abc"并更新字符串,依次为"a","b","c"
            // 第二层迭代为"3",将遍历对应的字符串"def"并更新字符串,若上一层迭代为"a",则添加、更新为"ad", "ae"与"af".
            int pos=digits[idx]-'0';  // 获取idx在digits的字符,如“2”对应的2
            string tmpStr=sList[pos];  // 获取下标pos对应的字符串,如2对应的"abc"
            for(int i=0;i<tmpStr.size();i++){
                helper(digits,s+tmpStr[i],idx+1);   // 进行下一层迭代,注意同一层迭代时不改变s和idx等参数值
            }
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值