784. Letter Case Permutation
题目描述
给定字符串S,我们可以把每个字母转成小写或大写,创造其他字符。返回所有可能的字符串的列表。
例子
Input: S = “a1b2”
Output: [“a1b2”, “a1B2”, “A1b2”, “A1B2”]
Input: S = “3z4”
Output: [“3z4”, “3Z4”]
Input: S = “12345”
Output: [“12345”]
思想
典型的DFS
解法
class Solution(object):
def letterCasePermutation(self, S):
"""
:type S: str
:rtype: List[str]
"""
res = []
self.dfs(0, S.lower() , '', res)
return res
def dfs(self, pos, s, temp, res):
if pos == len(s):
res.append(temp)
return
self.dfs(pos+1, s, temp+s[pos], res) # possiblity1
if 'a' <= s[pos] <= 'z':
self.dfs(pos+1, s, temp+s[pos].upper(), res) # possiblity2
77. Combinations
题目描述
给定两个整数n和k,返回从1…n中挑选k个数的所有可能组合。
例子
Input: n = 4, k = 2
Output:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思想
DFS
参数为n, k, temp所有可能组合, res
解法1
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
res = []
self.dfs(n, k, [], res)
return res
def dfs(self, n, k, temp, res):
if len(temp) == k:
res.append(temp)
return
for i in range(n, 0, -1):
self.dfs(i-1, k, temp + [i], res)
改进1:当k>n/2时,从[1,2,3…n]中移除k个元素
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
res = []
if k <= n/2:
self.helper1(n, k, [], res)
else:
self.helper2(n, k, list(range(1,n+1)), res)
return res
def helper1(self, n, k, temp, res):
if len(temp) == k:
res.append(temp)
return
for i in range(n, 0, -1):
self.helper1(i-1, k, temp + [i], res)
def helper2(self, n, k, temp, res): #remove elments
if len(temp) == k:
res.append(temp[:])
return
for i in range(n, 0, -1):
temp.remove(i)
self.helper2(i-1, k, temp, res)
temp.append(i)
解法2
数学
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
if k == 1:
return [[r] for r in range(1, n+1)]
if n < k:
return []
return [[n] + r for r in self.combine(n-1, k-1)] + self.combine(n-1, k)