ilyar1015

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

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

提示:

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

力扣第17题:电话号码的字母组合

解题思路:

​ 从题目得到,digits的范围在2~9之间,所有我们可以不考虑0和1。示例2已经提示到字符串位可能为空,所以需要单独处理一下。当然,在题目没有明确说明的时候,我们也需要这一步。本题我们可以使用回溯法。

如23,那就是2对应abc,3对应def,如下图所示。剩下的三位数,四位数的做法和下图类似。

image

​ 具体实现代码请看最下方代码实现

示例1

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

示例2

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

示例3

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

代码实现:

public List<String> letterCombinations(String digits) {
    List<String> list = new ArrayList<>();
    // 空字符串处理
    if (digits.length() == 0) return list;
    // 手机数字键盘所示,先存储到HashMap中。
    Map<Character, String> phoneNum = new HashMap<>();
    phoneNum.put(\'2\', "abc");
    phoneNum.put(\'3\', "def");
    phoneNum.put(\'4\', "ghi");
    phoneNum.put(\'5\', "jkl");
    phoneNum.put(\'6\', "mno");
    phoneNum.put(\'7\', "pqrs");
    phoneNum.put(\'8\', "tuv");
    phoneNum.put(\'9\', "wxyz");
    getPhoneNumText(list, phoneNum, digits, 0, new StringBuffer());
    return list;
}

public void getPhoneNumText(List<String> list, Map<Character, String> phoneNum, String digits, int index, StringBuffer s) {
    if (index == digits.length()) {
        list.add(s.toString()); // 当遍历结束后添加到list列表
    }else {
        char num = digits.charAt(index);  // 获取键盘数字
        String pNum = phoneNum.get(num); // 获取对应数字键盘的字母
        for (int i = 0; i < pNum.length(); i++) {
            s.append(pNum.charAt(i));
            getPhoneNumText(list, phoneNum, digits, index + 1, s);
            s.deleteCharAt(index); // 完成此操作后,删除对应值,即返回
        }
    }
}

分类:

技术点:

相关文章:

  • 2021-09-29
  • 2021-09-29
  • 2021-09-29
  • 2021-09-29
  • 2021-09-29
  • 2021-09-29
  • 2021-09-29
  • 2021-09-29
猜你喜欢
  • 2021-09-29
  • 2021-09-29
  • 2021-09-29
  • 2021-04-19
相关资源
相似解决方案