代码随想录刷题记录day23 组合问题+电话号码的字母组合

代码随想录刷题记录day23 组合问题+电话号码的字母组合

参考:代码随想录

216. 组合总和 III

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zClsxbGs-1668936527384)(temp.assets/image-20221120171532436.png)]

思想

组合问题,path 去收集符合条件的路径,res去收集结果。

for循环表示集合的广度,递归表示树的深度。

剪枝:当sum>n时,就可以终止,向上返回

代码
class Solution {
    List<List<Integer>> res=new ArrayList<>();
    List<Integer> path=new ArrayList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        //使用数字1到9  k个数 相加为 n
        backTracking(k,n,0,1);
        return res;
    }

    public void backTracking(int k, int n,int sum,int startIndex){
        if(sum>n) return;
        if(path.size()==k){
            if(sum==n){
                res.add(new ArrayList<>(path));
            }
            return ;
        }

        //单层递归的逻辑
        for(int i=startIndex;i<=9;i++){
            sum+=i;
            path.add(i);
            backTracking(k,n,sum,i+1);
            path.remove(path.size()-1);
            sum-=i;
        }
    }
}

17. 电话号码的字母组合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDYOdMme-1668936527388)(temp.assets/image-20221120172359987.png)]

思想

需要先将数字到字符做一个映射 用一个数组保存起来(刚开始这一步不知道怎么做)

String [] strArray={。。。}; 字符数组

用一个index 去记录 穿入的字符串”23“的下标 ,index=0 表示字符2,对应strArray[2] 的”abc“

另外集合的遍历都是从0开始的,不同于前面的组合问题,从startIndex开始,这是因为这里的遍历时两个集合。

代码
class Solution {
    List<String> res=new ArrayList<>();
    StringBuilder path=new StringBuilder();
    public List<String> letterCombinations(String digits) {
        // 解析字符串 放入map? 
        String[] strArray={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        backTracking(strArray,digits,0);
        return res;
    }

    public void backTracking(String[] strArray,String digits,int index){
        if(digits==null || digits.equals("") ) return ;
        if(path.length()==digits.length()){
            res.add(new String(path));
            return;
        }
        int digit=digits.charAt(index)-'0';//获取字符串"23"所对应的数字,即获取2
        String str=strArray[digit];
        for(int i=0;i<str.length();i++){
            path.append(str.charAt(i));
            backTracking(strArray,digits,index+1);
            path.deleteCharAt(path.length()-1);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值