LeetCode 17. 电话号码的字母组合

17. 电话号码的字母组合

难度 中等

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

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

LeetCode 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'] 的一个数字。

题解

​ 这道题就是把9键上的字母进行组合,那我们就需要进行枚举,但是长度不定,一般的for循环枚举没办法完成,那就用递归循环进行枚举,枚举完第n个位置的字母,再递归n+1个字母。

​ 例如”23“,枚举第一个元素的时候,2对应的是”abc“,进入递归枚举时,枚举了a;然后进入第二次递归,3对应的是”def“,枚举了d之后,进入第三层递归,发现枚举长度等于数组长度,结束枚举,添加字符”ad“进入结果集;又分别枚举e和f,添加字符串”ae“和”af“。

​ 第二层枚举结束之后,又回到第一层枚举,枚举b,有进入第二次枚举,分别枚举了d,e和f,添加字符串“bd”,“be”和“bf”。

​ 以此类推,完成所有枚举,就得到数字对应的字符串了。

class Solution {
    String[] word = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};//9键对应的字母

    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0){//长度为零,返回空
            return new ArrayList<String>();
        }
        List<String> list = new ArrayList<String>();//存储结果
        char[] temp = new char[digits.length()];//辅助字符串
        dfs(digits, 0, temp, list);
        return list;
    }

    void dfs(String digits, int idx, char[] temp, List<String> list){//idx为当前枚举第几个元素
        if(idx == digits.length()){//枚举长度等于字符串长度,枚举结束
            list.add(new String(temp));
            return;
        }
        int nowi = digits.charAt(idx) - '0';//获取字符串第idx个字符,转为数字
        String now = word[nowi - 2];//获取2~9数字对应的字母
        for(int i = 0; i < now.length(); i++){
            temp[idx] = now.charAt(i);//修改辅助字符串第idx个字符
            dfs(digits, idx + 1, temp, list);//递归枚举idx+1个字母
        }
    }
}

你可能感兴趣的:(LeetCode,ACM,leetcode,算法)