LeetCode 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

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

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
解法一:

迭代求解。

    public List<String> letterCombinations(String digits) {

        List<String> list = new ArrayList<>();

        if (digits.isEmpty()) {
            return list;
        }

        String[] strings = new String[]{"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

        list.add("");

        //对所有数字进行遍历
        for (int i = 0; i < digits.length(); i++) {

            //得到对应数字的字符串
            String str = strings[digits.charAt(i) - '2'];

            //获取当前列表中的字符串个数
            int size = list.size();

            //对列表中的字符串进行遍历
            for (int j = 0; j < size; j++) {
                //获取列表第一个字符串
                String temp = list.get(0);
                //然后删除它,因为该字符串不完整,所以不是我们要的答案
                list.remove(0);

                //然后遍历之前获得的对应数字的字符串,逐个添加字符,然后添加进列表
                for (int k = 0; k < str.length(); k++) {
                    list.add(temp + str.charAt(k));
                }
            }
        }
        return list;
    }
解法二:

递归求解。我们需要建立一个字典,用来保存每个数字所代表的字符串,然后我们还需要一个变量 level,记录当前生成的字符串的字符个数。

    public List<String> letterCombinations(String digits) {

        List<String> list = new ArrayList<>();

        if (digits.isEmpty()) {
            return list;
        }

        String[] strings = new String[]{"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

        letterCombinationsDFS(digits, strings, 0, new StringBuilder(), list);

        return list;
    }

    public void letterCombinationsDFS(String digits, String[] strings, int level, StringBuilder out, List<String> list) {

        //如果已经到达最后一层,则把字符串添加进列表
        if (level == digits.length()) {
            list.add(out.toString());
        } else {
            //获取对应数字的字符串
            String str = strings[digits.charAt(level) - '2'];

            for (int i = 0; i < str.length(); i++) {
                out.append(str.charAt(i));
                //添加完这一层的一个字符之后,继续添加下一层的字符
                letterCombinationsDFS(digits, strings, level + 1, out, list);
                //注意要回退字符串
                out.deleteCharAt(out.length() - 1);
            }
        }

    }

本题思路参考自 [LeetCode] Letter Combinations of a Phone Number 电话号码的字母组合

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容