17. 电话号码的字母组合

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


通过dfs遍历所有的位,逻辑中遍历字母。

这里的使用的是map作为映射。也可以使用String数组。

        String[] d = new String[]{" ", 
                                "", 
                                "abc", 
                                "def",
                                "ghi",
                                "jkl",
                                "mno",
                                "pqrs",
                                "tuv",
                                "wxyz"};

    // 注意条件:digits是在[2,9]区间内
    // 先整理数字和字母的映射。
    Map<Character, String> map = new HashMap<>();

    //结果
    List<String> list = new ArrayList<>();
    public List<String> letterCombinations(String digits) {
        if(digits == null || digits.length() == 0) {
            return ret;
        }

        prepareData();
        dfs("", 0, digits);
        return list;

    }

    public void prepareData() {
        char prev = 'a'-1;
        char ch = '2';
        for(int i=2;i<=9;i++) {

            int j=3;
            if(i==7 ||i==9) {
                j=4;
            }
            StringBuilder sb = new StringBuilder();
            for(int t=0;t<j;t++) {
                sb.append( (char)(prev+1));
                if(t!=j-1) {
                    sb.append(",");
                }
                prev = (char)(prev+1);
                
            }
            map.put(ch, sb.toString());
            ch = (char)(ch + 1);
        }

    }


    // 思路:遍历数字,即digits的每位,在该数字下,遍历所有的可能项。

    public void dfs(String str, int index, String digits) {
        // 如果位遍历完了,就添加结果。
        if(digits.length() == index) {
            list.add(str);
            return;
        }

        String[] strs = map.get(digits.charAt(index)).split(",");
        // 遍历该数字下所有的字母。
        for(String s : strs) {
            dfs(str + s,index+1,digits);
        }

    }
posted @ 2022-02-28 12:42  一颗青菜  阅读(9)  评论(0)    收藏  举报