电话号码的字母组合 - LeetCode 热题 57

大家好!我是曾续缘💥

今天是《LeetCode 热题 100》系列

发车第 57 天

回溯第 3 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

电话号码的字母组合

给定一个仅包含数字 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'] 的一个数字。
难度:💖💖

解题方法

这道题目是要求给定一个仅包含数字 ‘2-9’ 的字符串,返回所有这些数字能表示的字母组合。题目中给出了数字和字母的映射关系,类似电话按键上的对应关系。

我们可以利用回溯算法来生成所有可能的字母组合。

  1. 建立数字和字母的映射关系: 首先在代码中定义了一个 Map,将每个数字与其对应的字母序列进行了映射。这样做的目的是为了方便后续根据数字获取对应的字母选项。
  2. 初始化结果列表和特殊情况处理:letterCombinations 函数中,首先初始化了一个空的结果列表 ans。然后判断输入字符串的长度,如果长度为 0,则直接返回空列表。
  3. 回溯函数 backtrack 接着定义了一个回溯函数 backtrack,用于递归生成所有可能的字母组合,并将结果保存在 ans 列表中。
  4. 递归出口: 在回溯函数中,首先判断当前处理的数字是否已经到达字符串末尾,如果是则将当前生成的字母组合加入到结果列表中,然后返回。
  5. 获取当前数字对应的字母选项: 根据当前处理的数字,从映射关系中取出对应的字母选项,例如 ‘2’ 对应 “abc”。
  6. 遍历当前数字对应的字母选项: 对当前数字对应的字母选项进行遍历,将每个字母依次添加到暂存的 StringBuilder tmp 中,然后递归处理下一个数字。
  7. 回溯操作: 在递归之后,需要将刚刚添加的字母从 tmp 中删除,以便尝试其他的字母组合。

Code

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> ans = new ArrayList<String>();
        if(digits.length() == 0){
            return ans;
        }
        Map<Character, String> mp = Map.of(
            '2', "abc",
            '3', "def",
            '4', "ghi",
            '5', "jkl",
            '6', "mno",
            '7', "pqrs",
            '8', "tuv",
            '9', "wxyz"
        );
        backtrack(digits, 0, ans, mp, new StringBuilder());
        return ans;
    }
    private void backtrack(String digits, int cur, List<String> ans, Map<Character, String> mp, StringBuilder tmp){
        if(cur == digits.length()){
            ans.add(tmp.toString());
            return;
        }
        char ch = digits.charAt(cur);
        String choices = mp.get(ch);
        for(int i = 0; i < choices.length(); i++){
            tmp.append(choices.charAt(i));
            backtrack(digits, cur + 1, ans, mp, tmp);
            tmp.deleteCharAt(tmp.length() - 1);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值