[回溯系列] 组合总和+电话号码(day25)

文章介绍了如何使用回溯法来解决两道编程题目:LC216(组合总和3)和LC17(电话号码字母组合)。在LC216中,目标是找到所有由1到9的数字组成且和为n的k个数的组合,每个数字最多使用一次。在LC17中,给定包含2-9的数字字符串,生成所有可能的字母组合。文章提供了代码实现并强调了调试和处理特殊情况的重要性。
摘要由CSDN通过智能技术生成

LC216 组合总和3

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

1. 只使用数字1到9;2. 每个数字 最多使用一次。
返回所有可能的有效组合的列表 。组合可以以任何顺序返回

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        path, paths =[], []
        pathsum = 0
        def backtracking(startindex):
            nonlocal pathsum
            if len(path) == k and pathsum == n:
                paths.append(path[:])
                return
            if pathsum > n:
                return
            for i in range(startindex, 10):
                path.append(i)
                pathsum += i
                backtracking(i+1) # i+1 误写成了index+1,浪费了一些调试时间
                path.pop()  
                pathsum -= i
        backtracking(1)
        return paths

LC17 电话号码

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

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

给出两个测试用例:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
输入:digits = ""
输出:[]

思路:建立一个map,用数组或者用字典。第一次写的时候没考虑digits为空的情况,晚上再写一遍还是一样的错误提示,⚠️要注意哦。

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        map = [ [],[],['a','b','c'], \
        ['d','e','f'], ['g','h','i'],\
        ['j','k','l'], ['m','n','o'], \
        ['p','q','r','s'],['t','u', 'v'], \
        ['w','x','y','z']]
        path, paths = [], []
        p = 0
        if not digits: return []
        if digits == '1': return []
        def backtracking(strs):
            nonlocal p
            if p == len(digits):
                paths.append(''.join(path))
                return
            for i in map[int(digits[p])]:
                path.append(i)
                p += 1
                backtracking(strs)
                p -= 1
                path.pop()

        backtracking(digits)
        return paths

安慰自己:开始新的概念,做题老出错,需要调试总是难免的,加油。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值