电话号码的字母组合

263 阅读2分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

leetcode 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

解题: 由题目可得每个数字对应有3-4个字母,对于输入的字符串数字,每种组合都得包含每个数字对应的其中一个字母,就是字符串数字有多长,那组合的字母就得多长,并且不重复的,那就可以利用递归的回溯操作,遍历数字字符串的每一个数字获取其对应的字母,将其看成一个树形结构的组合,第一个数字为头节点,然后其对应的字母为子节点,然后字母下面的节点又对应第二个数字,第二个数字下面的子节点又方便对应其字母,以此类推。每次找到其中一条分支一直往下到底为一种组合,然后在回到上一个节点,找另外一个分支,如此反反复复查询完所有分支就获得所有组合。例如对于“23”先获取第一个数字对应的字母字符串abc,1.获取字符串第一个字母a,保存好字符串str,2.接着获取下一个字母字符串def,获取该字符串第一个字母d,保存好字符串str变成ad,3.然后后面还有数字就继续这样操作,否则就记录下当前字符串str为一个组合,然后去掉最后获取的字母d,4..接着获取e、f。第二个字符串结束后在回到1第一个字符串获取b。

“23”树形:

          2
   a      b       c
  3       3        3
d e f   d e f    d e f
class Solution {
 
    public List<String> letterCombinations(String digits) {
        List<String> combinations = new ArrayList<>();
        if (digits.length()==0){
            return combinations;
        }
        letterCombinations(combinations, new StringBuilder(), digits, 0);
        return combinations;

    }

    private void letterCombinations(List<String> combinations, StringBuilder str, String digits, int index) {
        // 数字取到头了
        if (index == digits.length()) {
            combinations.add(str.toString());
            return;
        }
        // 每次取出一个数字
        char c = digits.charAt(index);
        // 取出数字对应的字母
        String letter = getLetter(c);
        int letterLen = letter.length();
        // 遍历当前数字字母,在取得下一个数字的字母拼接
        for (int i = 0; i < letterLen; i++) {
            // 接上当前的字母
            str.append(letter.charAt(i));
            // 如果后面还有字母就把 后面的也这样接上
            letterCombinations(combinations, str, digits, index + 1);
            // 把后面的去掉,重新接其他字母
            str.deleteCharAt(index);
        }

    }

    private String getLetter(char c) {
        switch (c) {
            case '2':
                return "abc";
            case '3':
                return "def";
            case '4':
                return "ghi";
            case '5':
                return "jkl";
            case '6':
                return "mno";
            case '7':
                return "pqrs";
            case '8':
                return "tuv";
            case '9':
                return "wxyz";
            default:
                return "";
        }
    }

}