Loading...

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

给出数字到字母的映射如下(与电话按键相同)。注意 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'] 的一个数字。

题解

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
    /**
     * 使用多重循环实现
     */
    public List<String> letterCombinations(String digits) {
        // 如果为空,返回
        if ("".equals(digits)) return new ArrayList<>();
        // 初始化号码的字母
        Map<String, List<String>> map = new HashMap<>()<!--swig0-->);
            put("3", new ArrayList<>()<!--swig1-->);
            put("4", new ArrayList<>()<!--swig2-->);
            put("5", new ArrayList<>()<!--swig3-->);
            put("6", new ArrayList<>()<!--swig4-->);
            put("7", new ArrayList<>()<!--swig5-->);
            put("8", new ArrayList<>()<!--swig6-->);
            put("9", new ArrayList<>()<!--swig7-->);
        }};
        // 获取第一个号码的字母集
        List<String> result = map.get(digits.substring(0, 1));
        // 循环所有号码
        for (int i = 1; i < digits.length(); i++){
            String key = digits.substring(i, i + 1);
            // 临时存储结果集
            List<String> temp = new ArrayList<>();
            // 双重循环遍历拼接字母
            for (String start : result){
                for (String end : map.get(key)){
                    temp.add(start + end);
                }
            }
            // 赋值
            result = temp;
        }
        return result;
    }
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
    /**
     * 采用回溯实现
     */
    public List<String> letterCombinations(String digits) {
        List<String> result = new ArrayList<>();
        // 为空返回
        if ("".equals(digits)) return result;
        // 初始化号码的字母
        Map<String, List<String>> map = new HashMap<>()<!--swig8-->);
            put("3", new ArrayList<>()<!--swig9-->);
            put("4", new ArrayList<>()<!--swig10-->);
            put("5", new ArrayList<>()<!--swig11-->);
            put("6", new ArrayList<>()<!--swig12-->);
            put("7", new ArrayList<>()<!--swig13-->);
            put("8", new ArrayList<>()<!--swig14-->);
            put("9", new ArrayList<>()<!--swig15-->);
        }};
        // 递归
        recursion(map, result, digits, 0, new StringBuilder());
        return result;
    }
    private void recursion(Map<String, List<String>> map, List<String> result, String digits, int index, StringBuilder stringBuilder) {
        // 达到字母长度,存储结果集
        if (index == digits.length()){
            result.add(stringBuilder.toString());
        }else {
            // 循环当前字母集
            for (String value : map.get(digits.substring(index, index + 1))) {
                // 存储第一个字母
                stringBuilder.append(value);
                // 递归下一个字母集
                recursion(map, result, digits, index + 1, stringBuilder);
                // 回溯
                stringBuilder.deleteCharAt(index);
            }
        }
    }
}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number