回溯算法93|78|90

93复原IP地址

class Solution:
    def __init__(self):
        self.cut_s = ""
        self.result = []
        self.dot_num = 0

    def isValid(self, sub_s):
        if not sub_s:
            return False
        if sub_s[0] == "0" and len(sub_s) > 1:
            return False
        if int(sub_s) > 255:
            return False
        for item in sub_s:
            if ord(item) > ord("9") or ord(item) < ord("0"):
                return False
        return True
    
    def restoreIpAddresses(self, s: str) -> List[str]:
        self.backTracking(s, 0)
        return self.result

    def backTracking(self, s, start_index) -> List:
        if self.dot_num == 3:
            sub_s = s[start_index:]
            if self.isValid(sub_s):
                self.result.append(self.cut_s + sub_s)
            return
        for i in range(start_index + 1, len(s) + 1):
            sub_s = s[start_index:i]
            if not self.isValid(sub_s):
                continue
            if self.isValid(sub_s):
                self.cut_s = self.cut_s + sub_s + "."
                self.dot_num += 1
            self.backTracking(s, i)
            self.cut_s = self.cut_s[:-(len(sub_s) + 1)]
            self.dot_num -= 1

78子集

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

    def subsets(self, nums: List[int]) -> List[List[int]]:
        self.backTracking(nums, 0)
        return self.result

    def backTracking(self, nums, start_index) -> List:
        self.result.append(self.path[:])
        for i in range(start_index, len(nums)):
            self.path.append(nums[i])
            self.backTracking(nums, i + 1)
            self.path.pop()

90子集II

class Solution:
    def __init__(self):
        self.path = []
        self.result = []
        
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        used = [0] * len(nums)
        self.backTracking(nums, 0, used)
        return self.result

    def backTracking(self, nums, start_index, used):
        self.result.append(self.path[:])
        for i in range(start_index, len(nums)):
            if i > start_index and nums[i] == nums[i - 1] and used[i - 1] == 0:
                continue
            self.path.append(nums[i])
            used[i] = 1
            self.backTracking(nums, i + 1, used)
            self.path.pop()
            used[i] = 0

全部评论

相关推荐

程序员牛肉:1.大头肯定是院校问题,这个没啥说的。 2.虽然有实习,但是实习的内容太水了,在公司待了七个月的时间,看起来就只做了jwt和接入redis。爬取新闻,数据导入。这几个需求值得你做七个月吗?这不就是三四个月的工作量吗?我要是面试官的话真心会认为你能力不太行。所以既然有实习了,一定要好好写,像是Swagger这种东西是真没必要写上去,就拉一个包的事情。 3.我个人觉得话,在校生不要把自己当社招看,除非你的项目是特别牛逼,特别有名的含金量,否则不要写这种密密麻麻的一串子工作职责。你的项目只有一个作用,就是供面试官从中来抽取八股对你进行拷打。 但是你现在这个看不来什么技术点,可以改一下,详细表述一下你用什么技术实现了什么功能,在实现这个功能的过程中,你解决了什么难题。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务