题目链接

LeetCode

题目描述

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

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

17. 电话号码的字母组合 - 图1

示例 1:

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

示例 2:

输入: digits = “”
输出: []

示例 3:

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

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

    解题思路

    方法一:暴力法

    暴力遍历所有的情况

    1. class Solution {
    2. public List<String> letterCombinations(String digits) {
    3. int len = digits.length();
    4. List<String> res = new ArrayList<>();
    5. if(len==0){
    6. return res;
    7. }
    8. Map<Character,StringBuilder> mp = new HashMap<>();
    9. mp.put('2',new StringBuilder("abc"));
    10. mp.put('3',new StringBuilder("def"));
    11. mp.put('4',new StringBuilder("ghi"));
    12. mp.put('5',new StringBuilder("jkl"));
    13. mp.put('6',new StringBuilder("mno"));
    14. mp.put('7',new StringBuilder("pqrs"));
    15. mp.put('8',new StringBuilder("tuv"));
    16. mp.put('9',new StringBuilder("wxyz"));
    17. if(len==1){
    18. for(int i = 0;i<mp.get(digits.charAt(0)).length();i++){
    19. res.add(String.valueOf(mp.get(digits.charAt(0)).charAt(i)));
    20. }
    21. }else if(len == 2){
    22. for(int i = 0;i<mp.get(digits.charAt(0)).length();i++){
    23. for(int j = 0;j<mp.get(digits.charAt(1)).length();j++){
    24. res.add(String.valueOf(mp.get(digits.charAt(0)).charAt(i))+String.valueOf(mp.get(digits.charAt(1)).charAt(j)));
    25. }
    26. }
    27. }else if(len == 3){
    28. for(int i = 0;i<mp.get(digits.charAt(0)).length();i++){
    29. for(int j = 0;j<mp.get(digits.charAt(1)).length();j++){
    30. for(int k = 0;k<mp.get(digits.charAt(2)).length();k++){
    31. res.add(String.valueOf(mp.get(digits.charAt(0)).charAt(i))+String.valueOf(mp.get(digits.charAt(1)).charAt(j))+String.valueOf(mp.get(digits.charAt(2)).charAt(k)));
    32. }
    33. }
    34. }
    35. }else{
    36. for(int i = 0;i<mp.get(digits.charAt(0)).length();i++){
    37. for(int j = 0;j<mp.get(digits.charAt(1)).length();j++){
    38. for(int k = 0;k<mp.get(digits.charAt(2)).length();k++){
    39. for(int l = 0;l<mp.get(digits.charAt(3)).length();l++){
    40. res.add(String.valueOf(mp.get(digits.charAt(0)).charAt(i))+String.valueOf(mp.get(digits.charAt(1)).charAt(j))+String.valueOf(mp.get(digits.charAt(2)).charAt(k))+String.valueOf(mp.get(digits.charAt(3)).charAt(l)));
    41. }
    42. }
    43. }
    44. }
    45. }
    46. return res;
    47. }
    48. }

    方法二:回溯法

    class Solution {
      public List<String> letterCombinations(String digits) {
          List<String> ans = new ArrayList<String>();
          if(digits.length()==0){
              return ans;
          }
          Map<Character,String> phoneMap = 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");
          }};
          backtrack(ans,phoneMap,digits,0,new StringBuilder());
          return ans;
      }
      private void backtrack(List<String> ans,Map<Character,String> phoneMap,String digits,int index,StringBuilder combination){
          if(index == digits.length()){
              ans.add(combination.toString());
          }else{
              char digit = digits.charAt(index);
              String letter = phoneMap.get(digit);
              int len = letter.length();
              for(int i=0;i<len;i++){
                  combination.append(letter.charAt(i));
                  backtrack(ans,phoneMap,digits,index+1,combination);
                  combination.deleteCharAt(index);
              }
          }
    
      }
    }