电话号码的字母组合(17)

给定一个仅包含数字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); // 完成此操作后,删除对应值,即返回
        }
    }
}
posted @ 2021-06-15 23:31  ilyar1015  阅读(68)  评论(0编辑  收藏  举报