【29.电话号码的字母组合】

79 阅读1分钟

题目

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

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

示例 1:

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

题解

方式一:dfs + 队列

public List<String> letterCombinations(String digits) {
    List<String> result = new ArrayList<>();
    if (digits == null || digits.isEmpty()) {
        return result;
    }
    // 映射关系
    Map<Character, String[]> map = new HashMap<>();
    map.put('2', new String[]{"a", "b", "c"});
    map.put('3', new String[]{"d", "e", "f"});
    map.put('4', new String[]{"g", "h", "i"});
    map.put('5', new String[]{"j", "k", "l"});
    map.put('6', new String[]{"m", "n", "o"});
    map.put('7', new String[]{"p", "q", "r", "s"});
    map.put('8', new String[]{"t", "u", "v"});
    map.put('9', new String[]{"w", "x", "y", "z"});

    String[][] input = new String[digits.length()][];
    char[] chars = digits.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        input[i] = map.get(chars[i]);
    }

    dfs(input, result, new StringBuilder(), 0);
    return result;
}

public void dfs(String[][] input, List<String> result, StringBuilder deque, int level) {
    if (deque.length() == input.length) {
        result.add(deque.toString());
        return;
    }
    for (int i = 0; i < input[level].length; i++) {
        deque.append(input[level][i]);
        dfs(input, result, deque, level + 1);
        deque.deleteCharAt(deque.length() - 1); // 回溯
    }
}

总结

算法:dfs回溯
数据结构:队列