代码随想录第二十五天:216.组合总和III、17.电话号码的字母组合

216.组合总和III

这题和组合问题差不多,本题中给出的集合是固定的,多了一个和的限制。

class Solution(object):
    def combinationSum3(self, k, n):
        """
        :type k: int
        :type n: int
        :rtype: List[List[int]]
        """
        targetSum = n
        sum = 0
        startindex = 1
        res = []
        self.backtracking(n, k, sum, startindex, [], res)   
        return res    
        
    def backtracking(self, targetSum, k, sum, startindex, path, res):
        if sum > targetSum:  # 剪枝,如果元素总和已经大于targetSum了,就没有必要继续往后遍历了
            return
        if len(path) == k:
            if sum == targetSum:
                res.append(path[:])
                return
        for i in range(startindex, 9-(k-len(path))+2):   # 与组合问题同样的剪枝,如果for循环起始位置之后的元素个数已经不够还需要的个数了,就不用继续遍历了
            path.append(i)
            sum += i
            self.backtracking(targetSum, k, sum, i+1, path, res)
            sum -= i   # 回溯
            path.pop() # 回溯

17.电话号码的字母组合

1.数字与字母的映射:建立一个字母字符串的数组,下标就是对应的数字

2.本题中不再用startindex,用index来直接表示遍历到digits中的第几个数字了,为什么不用startindex了?因为这次是在两个不同的集合中分别取数来进行组合,遍历的时候不能再从startindex开始了,而是从头开始

class Solution(object):
    def __init__(self):
        self.lettersMap = [
            '',     # 0
            '',     # 1
            'abc',  # 2
            'def',  # 3
            'ghi',  # 4
            'jkl',  # 5
            'mno',  # 6
            'pqrs', # 7
            'tuv',  # 8
            'wxyz'  # 9
            ]
        self.res = []   # 收集结果
        self.s = ''     # 收集每个字母组合

    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if len(digits) == 0:
            return []
        self.backtracking(digits, 0)
        return self.res

    def backtracking(self, digits, index):
        if index == len(digits):     # 终止条件:如输入‘23’,往下递归两层就够了,到达叶子节点收集结果
            self.res.append(self.s)
            return
        digit = int(digits[index])   # index对应的数字
        letters = self.lettersMap[digit]   # 数字对应的字母集合
        for i in range(len(letters)):
            self.s += letters[i]
            self.backtracking(digits, index+1)   # index加一,处理下一个数字
            self.s = self.s[:-1]     # 回溯

题解:代码随想录代码随想录

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值