代码随想录算法训练营第二十八天|93.复原IP地址、78.子集、90.子集II

93.复原IP地址

93. 复原 IP 地址 - 力扣(LeetCode)

有效 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 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
示例 2:

输入:s = "0000"
输出:["0.0.0.0"]
示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
 

提示:

1 <= s.length <= 20
s 仅由数字组成

总结:这道题其实也是切割问题,重点在处理点符号上,逻辑和之前判断回文子串是差不多的。

        ①回溯的参数为,传入的字符串s,遍历开始指针startindex,以及记录点号数量的pointnum。另外类内还得有个数组记录结果result。无返回值类型

        ②回溯的终止条件为,当点号的数量为3时,进行判断,判断第四段数字是否合法,如果合法,则将s压入结果数组中,返回。如果不满足条件,则进入单层逻辑处理中。

        ③回溯的单层逻辑为,以startindex为起点,对字符串s进行遍历。首先判断startindex到i的字符子串是否合法,如果合法,则在字符串的第i+1个位置添加一个点号,并将pointnum++,然后进入回溯函数,并将i+2作为回溯函数参数传入,最后通过pointnum--和erase函数删除点号来进行回溯。

        其中判断字符子串是否合法的子函数可以分为三个思路:

        1.当数字长度不为1时,首数字不能为0

        2.数字不能是非法字符,只能是0-9的数字

        3.数字的大小不能超过255.

解法代码:代码随想录 (programmercarl.com)

78.子集

78. 子集 - 力扣(LeetCode)

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

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

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:

输入:nums = [0]
输出:[[],[0]]
 

提示:

1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同

总结:之前的回溯都是处理叶子节点,这道题处理的是每一个节点,终止条件前有些不一样的处理。

        ①回溯函数的参数为,输入的数组nums,记录开始节点的startindex。

        ②回溯函数的终止条件为,当startindex的值大于nums.size()的时候,return。将path压入结果数组的时间点应该在终止条件之前,这样可以保证所有的节点都被统计。

        ③回溯函数的单层处理,从startindex开始对数组进行遍历,先将nums[i]压入到path当中,调用回溯函数并将i+1作为参数输入,最后将path顶部元素弹出进行回溯。

解法代码:代码随想录 (programmercarl.com)

90.子集II

90. 子集 II - 力扣(LeetCode)

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

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

示例 1:

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:

输入:nums = [0]
输出:[[],[0]]
 

提示:

1 <= nums.length <= 10
-10 <= nums[i] <= 10

总结:这道题涉及遍历所有组合,还涉及去重复,相当于把回溯函数这几天做的题用的知识点串联起来用了一下。

        ①回溯函数的参数为,整数数组nums,遍历的起点startindex,用于去重的bool类型的数组used来判断该元素是否被用过了。另外,还得用一个类内数组保存当前组合path,一个保存结果的数组result。

        ②回溯函数的终止条件为,当startindex大于nums的大小时,return。将path压入result的操作放在每次回溯函数的第一句。

        ③回溯函数的单层逻辑为,用for循环从startIndex开始对数组进行遍历,首先判断是否符合去重的条件,符合则跳过。不用去重则将当前元素压入path,并且更新当前位置的used为true,代表此时的该元素不符合去重条件,未使用或者正在使用。调用回溯函数。接着更新当前位置的used为false,代表该元素用过了,之后再遍历到该元素则符合去重条件,将path的顶部元素弹出以实现回溯。return。

解法代码:代码随想录 (programmercarl.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值