17. 电话号码的字母组合

17. 电话号码的字母组合

题目链接
代码随想录

分析

77. 组合 是从同一个集合 m 中取 n 个元素进行组合,m<n,且元素不能重复,而这道题是从 m 个不同的集合中取 m 个元素进行组合,每个集合取出来一个元素,不用考虑元素重复的问题,更简单。
方法是,循环每一个位置上的所有可能即可,方法是用 for 循环嵌套,每一层 for 循环的变量都代表每一个位置上的所有可能的元素。
不过这里有两个优化的点:

解题

public char[][] mappping = new char[][]{{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};

public List<String> result = new ArrayList<>();

public List<String> letterCombinations(String digits) {
    char[] chars = digits.toCharArray();
    if(chars.length==0){
        return result;
    }
    getCombination(chars,0,new StringBuilder(""));
    return result;
}

public void getCombination(char[] source ,int index,StringBuilder comb){
    if(index == source.length){
        result.add(comb.toString());
        return;
    }
    char c = source[index];
    // 直接通过减去 '0' 这个字符,实际上是减去 '0' 的 ASCII 码来快速确定 int 值
    int num = c-'0';
    // 保证num 一定是2-9
    if(num<2 ||num >9){
        return;
    }
    // 注意这里是减2,数字减一之后,从数字变索引,还要减一
    char[] chars = mappping[num-2];
    for(int i=0;i<chars.length;i++){
        comb.append(chars[i]);
        getCombination(source,index+1,comb);
        comb.deleteCharAt(comb.length()-1);
    }
}

相关题

77. 组合
216. 组合总和 III