DFS与回溯专题:电话号码的字母组合

    DFS与回溯专题:电话号码的字母组合

题目链接: 17.电话号码的字母组合

参考题解: 代码随想录

题目描述

在这里插入图片描述

代码思路

将数字到字母的映射用字符串数组表示出来。然后利用回溯算法,解决n个for循环的问题,枚举出每一种符合要求的情况。

代码纯享版

class Solution {

    public List<String> list = new ArrayList();
    StringBuffer str = new StringBuffer();

    public List<String> letterCombinations(String digits) {
        String[] match = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        int num = 0;
        if(digits.length() != 0 && digits != null){
            backtrack(digits, match, num);
        }
        return list;
    }

    void backtrack(String digits, String[] match, int num){
        
        if(num == digits.length()){
            list.add(str.toString());
            return;
        }

        String temp = match[digits.charAt(num) - '0'];

        for(int i = 0; i < temp.length(); i++){
            str.append(temp.charAt(i));
            backtrack(digits, match, num + 1);
            str.deleteCharAt(str.length() - 1);
        }
    }
}

代码逐行解析版

class Solution {

    public List<String> list = new ArrayList(); //用于记录所有字母组合
    StringBuffer str = new StringBuffer(); //记录某个字母组合

    public List<String> letterCombinations(String digits) {

        //形成数字到字母的映射
        String[] match = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; 
        int num = 0; //用于判断要映射digits的第几个数字
        if(digits.length() != 0 && digits != null){
            backtrack(digits, match, num); //回溯
        }
        return list;
    }

    void backtrack(String digits, String[] match, int num){
        
        //当两者相等时,说明已经形成一个符合要求的字母组合
        if(num == digits.length()){ 
            list.add(str.toString()); //将字母组合加入list中
            return;
        }

        //temp用来表示当前digits第num位数字所映射到的字母
        String temp = match[digits.charAt(num) - '0']; 

        
        for(int i = 0; i < temp.length(); i++){ //循环遍历当前数字下的每一种字母情况
            str.append(temp.charAt(i)); //将字母添加到字符串str中
            backtrack(digits, match, num + 1); //递归到下一个数字位
            str.deleteCharAt(str.length() - 1); //回溯,删掉最后一个字母
        }
    }
}

代码有关问题的解释

能不能将backtrack(digits, match, num + 1); 改为

num++;
backtrack(digits, match, num);

答:不能。这样会导致num在循环中重复加很多次,导致递归时出现问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值