57.电话号码的字母组合

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

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

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

代码:

class Solution {
    //构建数字到字母的映射表
    public static final String[] LETTERS = {
        "",//0
        "",//1
        "abc",//2
        "def",//3
        "ghi",//4
        "jkl",//5
        "mno",//6
        "pqrs",//7
        "tuv",//8
        "wxyz"//9
    };
    public List<String> letterCombinations(String digits) {
        //res用来存储所有字母组合
        List<String>res = new ArrayList<>();
        //如果digits为空指针或者digits字符串不为空指针,但是长度为零,直接返回res本身
        if(digits == null || digits.length() == 0)return res;
        //sb用来存储中间字母组合
        StringBuilder sb = new StringBuilder();
        //递归寻找字母组合
        dfs(digits,0,sb,res);
        //返回res
        return res;
    }
    public void dfs(String digits,int idx,StringBuilder sb,List<String>res){
        //如果处理完了所有数字
        if(idx == digits.length()){
            //向res中添加当前组合
            res.add(sb.toString());
            return;
        }
        //获取当前数字对应的字母集合
        char c = digits.charAt(idx);
        String s = LETTERS[c-'0'];
        //遍历当前数字的每个字母
        for(char temp:s.toCharArray()){
            //选择当前字母
            sb.append(temp);
            //递归处理下一个数字
            dfs(digits,idx+1,sb,res);
            //回溯,撤销选择
            sb.deleteCharAt(sb.length()-1);
        }
    }
}
posted @ 2025-05-03 10:39  回忆、少年  阅读(20)  评论(0)    收藏  举报