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

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

难度:medium

回溯的题目,首先需要创建一个String类型的数组来记录电话号码对应的字符们,然后按照回溯的模板来即可,digits的长度为回溯的深度,每个数字对应的字符串的长度是回溯的宽度。要注意特殊情况的处理!

Java:

class Solution {
    List<String> ans = new ArrayList<>();
    String[] phoneNums = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    StringBuilder string = new StringBuilder();
    public List<String> letterCombinations(String digits) {
        // 我丢,忘了特殊情况
        if (digits == null || digits.length() == 0) {
            return ans;
        }
        backTracking(digits, 0);
        return ans;
    }
    public void backTracking(String digits, int num) {
        if (num == digits.length()) {
            ans.add(string.toString());
            return;
        }
        int str = digits.charAt(num) - '0';
        for (int i = 0; i < phoneNums[str].length(); i++) {
            string.append(phoneNums[str].charAt(i));
            backTracking(digits, num + 1);
            string.deleteCharAt(string.length() - 1);
        }
    }
}

Python:

class Solution:
    def __init__(self):
        self.answers: List[str] = []
        self.answer: str = ''
        self.letter_map = {
            '2': 'abc',
            '3': 'def',
            '4': 'ghi',
            '5': 'jkl',
            '6': 'mno',
            '7': 'pqrs',
            '8': 'tuv',
            '9': 'wxyz'
        }

    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return self.answers
        self.backtracking(digits, 0)
        return self.answers

    def backtracking(self, digits: str, index: int) -> None:
        if len(self.answer) == len(digits):
            self.answers.append(self.answer)
            return
        letters = self.letter_map[digits[index]]
        for letter in letters:
            self.answer += letter
            self.backtracking(digits, index + 1)
            self.answer = self.answer[:-1]

 

复杂度分析:

  • 时间复杂度:O(3^m*4^n),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),nn 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。当输入包含 m 个对应 3 个字母的数字和 n 个对应 4 个字母的数字时,不同的字母组合一共有 3^m*4^n 种,需要遍历每一种字母组合。
  • 空间复杂度:O(m+n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n 是输入数字的总个数。除了返回值以外,空间复杂度主要取决于哈希表以及回溯过程中的递归调用层数,哈希表的大小与输入无关,可以看成常数,递归调用层数最大为 m+n。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值