• 代码随想录算法训练营第二十八天| 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
  • 相关阅读:
    全球主存储市场加速创新,华为连续8年打造中国高科技名片
    [每周一更]-(第18期):Postman全局配置token信息,加速测试接口进度
    java学习--day18(TreeSet底层&内部类)
    笔记1.5:计算机网络体系结构
    12.MYSQL基础-常见函数
    C#集成ViewFaceCore人脸检测识别库
    php如何解决高并发的问题?
    Web3与Web3.0: Web3指的是去中心化和基于区块链的网络,Web3.0指的是链接或语义网络。
    Leetcode刷题详解——找到字符串中所有字母异位词
    Dubbo 2.6.1升级
  • 原文地址:https://blog.csdn.net/weixin_48323589/article/details/127748017