DFS+回溯专题10 - leetcode784. Letter Case Permutation/77. Combinations

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/84937499

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)

猜你喜欢

转载自blog.csdn.net/a786150017/article/details/84937499