• 代码随想录算法训练营第二十八天| LeetCode93. 复原 IP 地址、LeetCode78. 子集、LeetCode90. 子集 II


    一、LeetCode93. 复原 IP 地址

            1:题目描述(93. 复原 IP 地址

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

    • 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245""192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

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

            2:解题思路

    1. class Solution:
    2. def __init__(self):
    3. self.res = []
    4. def restoreIpAddresses(self, s: str) -> List[str]:
    5. # 当字符串长度大于12时,怎么切割都不合法
    6. if len(s) > 12:
    7. return []
    8. # 当字符串长度小于等于12时,调用切割函数进行切割
    9. # 开始切割的起始位置为0,“.”的个数和为0
    10. self.division(s, 0, 0)
    11. return self.res
    12. def division(self, s, startindex, pointSum):
    13. # s表示字符串
    14. # startindex表示开始切割的位置
    15. # pointSum表示“.”的个数,当“.”个数为3时,字符串就全部被切割了
    16. if pointSum == 3:
    17. # 当“.”的个数等于3时,已经将字符串切割为4段了
    18. # 校验一下最后一段的字符串是否合法
    19. if self.is_valid(s, startindex, len(s)):
    20. # 合法,就将用“.”分割后的字符串加入到res中
    21. self.res.append(s)
    22. return
    23. for i in range(startindex, len(s)):
    24. # 判断切割的字符串是否合法
    25. if self.is_valid(s, startindex, i+1):
    26. # 合法,切割字符串,加“.”
    27. s = s[:i+1] + "." + s[i+1:]
    28. # "."个数加1
    29. pointSum += 1
    30. # 调用递归,startindex为什么是i+2,因为添加了“.”,多了一个字符,整体往后移动了一个字符
    31. self.division(s, i+2, pointSum)
    32. # 回溯,为什么是i+2,因为添加了“.”,多了一个字符,整体往后移动了一个字符
    33. s = s[:i+1] + s[i+2:]
    34. pointSum -= 1
    35. else:
    36. break
    37. def is_valid(self, s, startindex, endindex):
    38. # 不符合要求的三种情况
    39. if startindex >= endindex:
    40. # 当切割字符串的开始位置大于结束位置,直接返回False
    41. return False
    42. if s[startindex] == "0" and startindex != endindex-1:
    43. # 当切割两位以上,开头字符为0,不是合法的字符串,返回False
    44. return False
    45. if not 0 <= int(s[startindex:endindex]) <= 255:
    46. # 当切割的字符串的值不在0到255的范围内,不是合法的字符串,返回False
    47. return False
    48. return True

    二、LeetCode78. 子集

            1:题目描述(78. 子集

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

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

            2:解题思路

    1. class Solution:
    2. def subsets(self, nums: List[int]) -> List[List[int]]:
    3. res = []
    4. path = [] # 存放每个符合要求的子集
    5. def subset(nums, startindex):
    6. res.append(path[:]) # 将path加入res中
    7. if startindex == len(nums):
    8. # 当开始遍历的位置等于nums的长度时,返回上层
    9. return
    10. for i in range(startindex, len(nums)):
    11. path.append(nums[i])
    12. subset(nums, i+1)
    13. # 回溯
    14. path.pop()
    15. subset(nums, 0)
    16. return res

    三、LeetCode90. 子集 II

            1:题目描述(90. 子集 II

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

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

            2:解题思路

    1. class Solution:
    2. def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
    3. res = []
    4. path = []
    5. # used用来标记nums中对应下标的元素是否使用过,0为:没使用过,1为:已使用过
    6. used = [0] * len(nums)
    7. # 先对nums进行排序
    8. nums = sorted(nums)
    9. def subsets(nums, startindex, used):
    10. res.append(path[:])
    11. if startindex == len(nums):
    12. return
    13. for i in range(startindex, len(nums)):
    14. # 当i>0,前一个元素与当前元素的值相等,并且前一个元素没有被使用过
    15. # 说明改元素包含的组合已经在前一个元素中出现过,所以不用继续向下一层遍历了,直接进入下一次循环
    16. if i > 0 and nums[i-1] == nums[i] and used[i-1] == 0:
    17. continue
    18. # 将当前元素加入到path中
    19. path.append(nums[i])
    20. # 将当前元素的下标在used中对应下标的元素值修改为1,表示这个元素被使用了
    21. used[i] = 1
    22. # 递归调用,进入下一层
    23. subsets(nums, i+1, used)
    24. # 回溯
    25. path.pop()
    26. # 需要把当前元素下标在used中对应下标的元素值修改为0,表示这个元素没有被使用
    27. used[i] = 0
    28. subsets(nums, 0, used)
    29. return res
  • 相关阅读:
    PaperMoon开发者关系工程师(中国)招聘
    这 10 种架构师,不合格!
    (游戏:三个数的加法)编写程序,随机产生三个一位整数,并提示用户输入这三个整数的和,判断用户输入的和是否正确。
    IF 19.865代谢组学高分文章,非靶标代谢流助力揭示18SrRNA中m6A控制肝癌机制!
    汽车电子控制系统的构成
    vue用法示例(一)
    【Spring】使用aop切面编程时要给那些类加注解
    SpringBoot-19-模块开发-员工修改/删除
    springboot-基础-eclipse配置+helloword示例
    el-table <template slot=“header“>不更新问题
  • 原文地址:https://blog.csdn.net/weixin_48323589/article/details/127748017