给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

    phone_keypad.png

    示例:

    输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

    说明:

    尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

    1. import java.util.ArrayList;
    2. import java.util.HashMap;
    3. import java.util.List;
    4. import java.util.Map;
    5. public class LetterCombinations {
    6. public List<String> letterCombinations(String digits) {
    7. List<String> result = new ArrayList<>();
    8. if (digits == null || digits.length() == 0) {
    9. return result;
    10. }
    11. Map<Character, Character[]> map = new HashMap<>();
    12. map.put('2', new Character[]{'a','b','c'});
    13. map.put('3', new Character[]{'d','e','f'});
    14. map.put('4', new Character[]{'g','h','i'});
    15. map.put('5', new Character[]{'j','k','l'});
    16. map.put('6', new Character[]{'m','n','o'});
    17. map.put('7', new Character[]{'p','q','r', 's'});
    18. map.put('8', new Character[]{'t','u','v'});
    19. map.put('9', new Character[]{'w','x','y', 'z'});
    20. select(result, 0, new StringBuffer(), map, digits);
    21. return result;
    22. }
    23. private void select(List<String> result, int index, StringBuffer word, Map<Character, Character[]> map, String digits) {
    24. if (word.length() == digits.length()) {
    25. result.add(word.toString());
    26. } else {
    27. char c = digits.charAt(index);
    28. Character[] characters = map.get(c);
    29. for (Character character : characters) {
    30. word.append(character);
    31. select(result, index + 1, word, map, digits);
    32. word.deleteCharAt(index);
    33. }
    34. }
    35. }
    36. }