leetcode 17题

leetcode 第17题 解题分析

leetcode 17

这道题目是一道经典的回溯算法题,主要目的为寻找出最多解。
回溯算法本质就是递归的调用,整体表现为一个树形结构

在这里插入图片描述下面是代码部分

def letterCombinations(digits: str):
    leeterMap = ["","","abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
    # 保存0-9 分别对应的字母
    res = list()

    def find_combination(digits, index: int, s: str):
        # 递归部分
        if (index == len(digits)):
            res.append(s)
            return
        c = digits[index]
        if (c >= '0' and c <= '9' and c != '1'):
            leeters = leeterMap[ord(c) - ord('0')]
            for i in range(len(leeters)):
                find_combination(digits, index + 1, s + leeters[i])


    if (len(digits) == 0):
        return []
    find_combination(digits, 0, "")
    return res

digits = '23'
a = letterCombinations(digits)
print(a)

递归的第一步,首先设置一个递归的结束条件

        if (index == len(digits)):  # 当返回字符串长度与数字串长度相同时,返回值
            res.append(s)
            return

在递归终止,返回值时,我先定义了一个数组,用来保存返回的字符串。
结束条件定义完毕后,便开始定义函数主体了。

c = digits[index]    # 获取数字串中的数字
if (c >= '0' and c <= '9' and c != '1'):
    leeters = leeterMap[ord(c) - ord('0')]  # 判断数字对应的字符串
    for i in range(len(leeters)):    #使用for循环,依次组合字符串
        find_combination(digits, index + 1, s + leeters[i]) 

根据我的理解,这里for循环与递归的组合,本质上,就是,在做一些固定组合问题时使用for循环的方法,只不过,在做固定组合问题时,for循环的次数,自己是可知的,但在这里,却是以一个动态形式存在,只有当数的枝杈完全到达底部后,才会开始返回值,多看几遍,基本上就理解了,在这之前,尽量将递归的知识补充完全,做这道题,才会得心应手。
回溯本身也是属于暴力解法,所以时间复杂度可想而知,不过,我觉得,它在解决有些问题上,非它不可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值