代码随想录算法训练营第28天

65 阅读1分钟

93.复原IP地址

还是需要多复习一下这道题和分割回文串

class Solution:

    def __init__(self):
        self.res = []
        self.track = []

    def restoreIpAddresses(self, s: str) -> List[str]:
        self.backtrack(s, 0)
        return self.res

    # 回溯算法框架
    def backtrack(self, s: str, start: int) -> None:
        if start == len(s) and len(self.track) == 4:
            # base case,走到叶子节点
            # 即整个 s 被成功分割为合法的四部分,记下答案
            self.res.append('.'.join(self.track))
        for i in range(start, len(s)):
            if not self.is_valid(s, start, i):
                # s[start..i] 不是合法的 ip 数字,不能分割
                continue
            if len(self.track) >= 4:
                # 已经分解成 4 部分了,不能再分解了
                break
            # s[start..i] 是一个合法的 ip 数字,可以进行分割
            # 做选择,把 s[start..i] 放入路径列表中
            self.track.append(s[start:i + 1])
            # 进入回溯树的下一层,继续切分 s[i+1..]
            self.backtrack(s, i + 1)
            # 撤销选择
            self.track.pop()
    def is_valid(self, s, start, end):
        if start > end:
            return False
        if s[start] == '0' and start != end:  # 0开头的数字不合法
            return False
        num = 0
        for i in range(start, end + 1):
            if not s[i].isdigit():  # 遇到非数字字符不合法
                return False
            num = num * 10 + int(s[i])
            if num > 255:  # 如果大于255了不合法
                return False
        return True
    

78.子集

元素无重不可复选

class Solution:
    def __init__(self):
        self.track=[]
        self.path=[]
    def subsets(self, nums: List[int]) -> List[List[int]]:
        self.backtrack(nums,0)
        return self.path
    def backtrack(self,nums,start):

        self.path.append(self.track.copy())
        for i in range(start,len(nums)):
            self.track.append(nums[i])
            self.backtrack(nums,i+1)
            self.track.pop()

90.子集Ⅱ

元素有重不可复选,这道题要对数组进行排序,然后剪枝掉相邻元素相同的枝

class Solution:
    def __init__(self):
        self.track=[]
        self.path=[]
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        self.backtrack(0,nums)
        return self.path
    
    def backtrack(self,start,nums):
        self.path.append(self.track.copy())
        for i in range(start,len(nums)):
            if i>start and nums[i]==nums[i-1]:
                continue
            self.track.append(nums[i])
            self.backtrack(i+1,nums)
            self.track.pop()