数字 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