力扣第17题电话号码的字母组合

一、题目:17.

二、题目解析:

改题主要就是让我们找出数字对应字符的组合问题,这个排列组合可以用树的形式表示出来,说白了就是把根结点到叶子结点上的每一条路径的所有字符加起来。

从而问题就被转换成了从根结点到叶子结点一共有多少条路径:

三、代码如下:

public List<String> letterCombinations(String digits) {
        //使用一个集合来存储所有的字母组合结果
        List<String> combinations = new ArrayList<>();
        if (digits == null || digits.length() == 0)
            return combinations;

        //将号码字母对应关系存储进Map
        //存储为数组更好操作
        HashMap<Character, String> map = new HashMap<Character, String>() {
         
  {
            put(2, "abc");
            put(3, "def");
            put(4, "ghi");
            put(5, "jkl");
            put(6, "mno");
            put(7, "pqrs");
            put(8, "tuv");
            put(9, "wxyz");
        }};
        //回溯
        backTracking(combinations,map,0,digits,new StringBuilder());
        return combinations;
    }

    private void backTracking(List<String> combinations,Map<Character,String> phoneMap,int index,String digits,StringBuilder sb) {
        //递归到叶子结点,找到一个结果,则加到结果集
        if(index == digits.length()){
            combinations.add(sb.toString());
        }else {
            char c = digits.charAt(index);
            String letters = phoneMap.get(c);
            int length = letters.length();
            for (int i = 0; i < length ; i++) {
                sb.append(letters.charAt(i));
                backTracking(combinations,phoneMap,index+1,digits,sb);
                //递归到一个叶子节点后,需要找下一个组合,这里开始回溯
                sb.deleteCharAt(index);
            }
        }
    }

四、测试

五、结束

经验分享 程序员 微信小程序 职场和发展