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

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

  • 93.复原IP地址
  • 78.子集
  • 90.子集II

93.复原IP地址

题目:给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。

题目链接:93. 复原 IP 地址

class Solution:
    def __init__(self):
        self.result = []

    def restoreIpAddresses(self, s: str) -> List[str]:
        self.result.clear()
        if len(s) > 12: # 超过12就不是ip地址了
            return []
        self.backtracking(s, 0, 0)
        return self.result

    def backtracking(self, s:str, start_index: int, point_num: int) -> None:
        
        if point_num == 3:
            if self.is_valid(s, start_index, len(s) - 1): 
                self.result.append(s[:])
            return 

        for i in range(start_index, len(s)):
            if self.is_valid(s, start_index, i):
                s = s[:i+1] + '.' + s[i+1:] # [start_index, i]就是被截取的子串
                self.backtracking(s, i+2, point_num+1)  # 在填入.后,下一子串起始后移2位
                s = s[:i+1] + s[i+2:]    # 回溯
            else:
                break
    
    def is_valid(self, s: str, start: int, end: int) -> bool:
        if start > end:
            return False
        if s[start] == '0' and start != end: # 段位以0为开头的数字不合法
            return False
        if not 0 <= int(s[start: end + 1]) <= 255: # 段位如果大于255了不合法
            return False
        return True

78.子集

题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。

题目链接: 78. 子集

class Solution:
    def __init__(self):
        self.path: List[int] = []
        self.paths: List[List[int]] = []

    def subsets(self, nums: List[int]) -> List[List[int]]:
        self.path.clear()
        self.paths.clear()
        self.backtracking(nums, 0)
        return self.paths

    def backtracking(self, nums: List[int], start_index: int) -> None:
        self.paths.append(self.path[:]) # 收集子集,要放在终止添加的上面,否则会漏掉自己
        if start_index == len(nums):
            return      
        for i in range(start_index, len(nums)):
            self.path.append(nums[i])
            self.backtracking(nums, i + 1)
            self.path.pop()

90.子集II

题目:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。

题目链接:90. 子集 II

class Solution:
    def __init__(self):
        self.path = []
        self.paths = []

    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        self.path.clear()
        self.paths.clear()
        nums.sort()
        self.backtracking(nums, 0)
        return self.paths

    def backtracking(self, nums: List[int], start_index: int) -> None:
        self.paths.append(self.path[:])

        if start_index == len(nums):
            return  
        
        for i in range(start_index, len(nums)):
            if i > start_index and nums[i] == nums[i - 1]:
                continue # 当前后元素值相同时,跳入下一个循环,去重
            self.path.append(nums[i])
            self.backtracking(nums, i + 1)
            self.path.pop() # 回溯

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