代码随想录算法训练营第二十八天| 93.复原IP地址、78.子集 、90.子集II

代码随想录算法训练营第二十八天| 93.复原IP地址、78.子集 、90.子集II

题目

93.复原IP地址

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" "192.168.1.1"有效 IP 地址,但是 "0.011.255.245""192.168.1.312""[email protected]"无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]: 
        res = []
        pointNum = 0
        self.backstracking(s, 0, 0, "", res)
        return res

    def backstracking(self, s, pointNum, starIndex, curPath, res):
        if pointNum == 3:
            if self.isValid(s, starIndex, len(s)-1):
                curPath += s[starIndex:]
                res.append(curPath)
            return
        for i in range(starIndex, len(s)):
            if self.isValid(s, starIndex, i):
                sub = s[starIndex: i+1]
                self.backstracking(s, pointNum+1, i+1, curPath+sub+'.', res)

    def isValid(self, s, starIndex, endIndex):
        if starIndex > endIndex:return False
        if starIndex < endIndex and s[starIndex] == '0':return False
        sum_ = 0
        for i in range(starIndex, endIndex+1):
            if not s[i].isdigit():
                return False
            sum_ = sum_ * 10 + int(s[i])
            if sum_ > 255:return False
        return True

题目

78.子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = []
        used = [False] * len(nums)
        self.backtracking(0, [], nums, res)
        return res

    def backtracking(self, startIndex, curPath, nums, res):
        res.append(curPath[:])
        for i in range(startIndex, len(nums)):
            curPath.append(nums[i])
            self.backtracking(i+1, curPath, nums, res)
            curPath.pop()

题目

90.子集II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        res = []
        nums.sort()
        self.backstracking(nums, 0, [], res)
        return res
    def backstracking(self, nums, startIndex, curPath, res):
        if curPath not in res:
            res.append(curPath[:])
        for i in range(startIndex, len(nums)):
            curPath.append(nums[i])
            self.backstracking(nums, i+1, curPath, res)
            curPath.pop()

你可能感兴趣的:(代码随想录,leetcode,算法)