Leetcode:括号生成&电话号码的字母组合

文章介绍了如何使用递归和二叉树遍历思想生成所有有效括号组合的函数,以及如何将数字转换为字母组合的解决方案,通过字典映射实现
摘要由CSDN通过智能技术生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

 这道题是一个非常经典的二叉树遍历思想的题型,在此记录一下。

思想:使用二叉树遍历生成所有的括号组合方式,然后将不符合的删除掉,在生成括号的时候用代码写成先生成‘(’,再生成‘)’,这样就不会出现)(的情况。

二叉树遍历使用递归的思想产生;

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        a = []
        left = 0
        right = 0
        def dfs(path, left, right):
            if left > n or left < right:
                return
            if len(path) == 2*n:
                a.append(path)
                return
            dfs(path + '(', left + 1, right)
            dfs(path + ')', left, right + 1)
        dfs('', left, right)
        return a 

在递归函数dfs中,添加条件如果left > n or left < right的情况下直接返回,表示是不符合要求的括号组合:例如)))(,(((),这种,然后通过第一层条件筛选出不符合条件的,之后把符合条件的括号组合全部添加导到a[]中,最后返回a就可以了。

刚刷完括号组成,就刷到了一个电话号码组合:

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

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

示例 1:

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

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

 

 

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if not digits:return []

        a = []
        dic = {'2':['a','b','c'], 
               '3':['d','e','f'],
               '4':['g','h','i'],
               '5':['j','k','l'],
               '6':['m','n','o'],
               '7':['p','q','r','s'],
               '8':['t','u','v'],
               '9':['w','x','y','z']}
        def wishback(letter,new_digits):
            if len(new_digits) == 0:
                a.append(letter)
            else:
                for key in dic[new_digits[0]]:
                    wishback(letter + key, new_digits[1:])
        wishback('',digits)
        return a

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小赵每天都来学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值