目录
题目
回溯
代码
题目
思路
代码
题目
思路
代码
77. 组合
回溯
1)先确定边界条件,if len(path) == k:
res.append(path[:])2) dfs(i + 1, path + [i]) 递归下一个元素
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
def dfs(start, path):
if len(path) == k:
res.append(path)
return
upper_bound = n - (k - len(path)) + 1
for i in range(start, upper_bound + 1):
dfs(i + 1, path + [i])
res = []
dfs(1, [])
return res
46. 全排列
path记录结果,cand.....没用过的元素 最上面 不断遍历的数字
利用切片将i元素去掉
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
if len(nums) <= 1: return [nums]
self.res = []
def recur(path,cand):
if len(cand) == 0:
self.res.append(path)
for i,n in enumerate(cand):
recur(path+[n],cand[:i]+cand[i+1:])
recur([],nums)
return self.res
784. 字母大小写全排列
思路
我们可以看到我们有三种选择
1.如果是大写则转换为小写
2.如果是小写则转换为大写
3.不进行转换
class Solution:
def letterCasePermutation(self, s: str) -> List[str]:
res = []
def dfs(idx, n, s:str):
if idx == n:
res.append(s)
return
if s[idx].islower():
dfs(idx + 1, n, s[:idx] + chr(ord(s[idx]) - 32) + s[idx + 1:])
if s[idx].isupper():
dfs(idx + 1, n, s[:idx] + chr(ord(s[idx]) + 32) + s[idx + 1:])
dfs(idx + 1, n, s)
dfs(0, len(s), s)
return res