有效 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 终止条件里 如果startindex == len(s)就代表切割到数组尾部了,注意path数组的长度也要为4才行,这点我忽略了想了好久
2 然后定义一个判断是否合法的函数,如果有非数字的不合法,长度不为1且开头是0的不合法当然数字超过255的也不合法
然后就可以回溯启动了:
这道题自己独立ac还是非常爽的,再去看看视频学习一下:
回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili
看完以后觉得理解startindex和for循环中变量i还是非常重要的,我认为回溯算法中最抽象的莫过于这里,搞懂回溯树还是任重而道远啊。
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
这一题的难点应该就在于终止条件,用什么条件来确定递归终止呢,以及什么时候收获结果呢?先去看视频学习一下:
回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集_哔哩哔哩_bilibili
看完以后明白了,首先终止条件还是和我想的一样,start index >= len(nums) 就返回,但是子集问题与之前问题不同的地方在于取数:
如果说组合问题和分割字符串问题都是在叶子节点去结果,子集问题就是要在整个数是取结果。
这一题核心难点就在result放在哪,原来是直接放在开头,进入函数就直接添加结果,这一点一定要记住!
给你一个整数数组 nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
这里就是子集加used去重,注意不要打错了。