代码随想录算法训练营第二十四天 |回溯算法part03

80 阅读2分钟

代码随想录算法训练营第二十四天 |回溯算法part03

93 复原IP地址

image.png

纯手搓,动动脑子就能做出来,其实就是改一下返回条件,加两个判断条件就行了。

如果长度是4并且遍历到最后了,那就返回。

如果长度大于4,那么直接返回。

如果开头是0,而且后面还有数,那也返回。

如果组成的数大于255了,那么直接返回。

s = "010010"
def backtracking(s,result,path,index):
    if len(path) == 4 and index == len(s):
        result.append('.'.join(path))
        return
    for i in range(index,len(s)):
        if len(path) > 4:
            return
        if int(s[index:i+1]) > 255:
            return
        if int(s[index]) == 0 and len(s[index:i+1]) > 1 and s[index+1] :
            break
        path.append(s[index:i+1])
        backtracking(s,result,path,i+1)
        path.pop()
​
result = []
backtracking(s,result,[],0)
print(result)

78 子集

image.png

思路:有数就加进来,但是不要return,因为一旦return就会pop

    nums = [0]
    def backtracking(nums,path,result,index):
        if path :
            result.append(path[:])
            # return
        for i in range(index,len(nums)):
            path.append(nums[i])
            backtracking(nums,path,result,i+1)
            path.pop()
    result = [[]]
    backtracking(nums,[],result,0)
    print(result)

90 子集II

image.png

思路:和40 组合总和几乎一模一样,就是多了一个判断的条件,因为每个数只能出现一次,那么就需要用index+1了。

另外,也有可能出现 1 1 2 和 2 1 1 这种情况,所以就需要进行如下判断:

if i > index and nums[i] == nums[i-1]:
    continue

那么为什么是这个呢?

i > index: 这个条件保证只有当 i 的值大于 index 时,才会进行检查。这是因为我们希望在每一层递归中,只有当前的元素与前一个元素相等时,才进行跳过处理,而第一个元素(即 i == index)不需要与前一个元素比较。

nums[i] == nums[i-1] : 这个条件检查当前元素 nums[i] 是否与前一个元素 nums[i-1] 相同。如果相同,意味着当前元素已经在之前的路径中出现过,跳过当前元素可以避免产生重复的组合。

这两行代码的意思是,我先遍历第一个数,然后遍历到这一轮的下一个数的时候,我再进行比较,比较当前数和前一个数是否一样,如果一样,就跳过。

比如说 1 1 2 3,我刚开始遍历了1了,然后到了第2个1 我就不遍历了,完整代码如下:

nums = [1,2,2]
nums.sort()
def backtracking(nums,path,result,index):
    if path :
        result.append(path[:])
        # return
    for i in range(index,len(nums)):
        if i > index and nums[i] == nums[i-1]:
            continue
        path.append(nums[i])
        backtracking(nums,path,result,i+1)
        path.pop()
​
result = [[]]
backtracking(nums,[],result,0)
print(result)