惠州app网站建设排行榜,抖音产品推广方案,动易网站地图,wordpress4.7.2 xssDay2493.复原IP地址力扣题目链接给定一个只包含数字的字符串#xff0c;复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数#xff08;每个整数位于 0 到 255 之间组成#xff0c;且不能含有前导 0#xff09;#xff0c;整数之间用 . 分隔。例如#…Day2493.复原IP地址力扣题目链接给定一个只包含数字的字符串复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数每个整数位于 0 到 255 之间组成且不能含有前导 0整数之间用 . 分隔。例如0.1.2.201 和 192.168.1.1 是 有效的 IP 地址但是 0.011.255.245、192.168.1.312 和 192.1681.1 是 无效的 IP 地址。思路其实还是切割问题递归参数startIndex一定是需要的因为不能重复分割记录下一层递归分割的起始位置。本题我们还需要一个变量pointNum记录添加逗点的数量。递归终止条件本题明确要求只会分成4段所以不能用切割线切到最后作为终止条件而是分割的段数作为终止条件。pointNum表示逗点数量pointNum为3说明字符串分成了4段了。然后验证一下第四段是否合法如果合法就加入到结果集里单层搜索的逻辑在for (int i startIndex; i s.size(); i)循环中 [startIndex, i] 这个区间就是截取的子串需要判断这个子串是否合法。如果合法就在字符串后面加上符号.表示已经分割。如果不合法就结束本层循环然后就是递归和回溯的过程递归调用时下一层递归的startIndex要从i2开始因为需要在字符串中加入了分隔符.同时记录分割符的数量pointNum 要 1。回溯的时候就将刚刚加入的分隔符. 删掉就可以了pointNum也要-1。代码class Solution {ListString res new ArrayList();int pointNum 0;//记录加入的.数量public ListString restoreIpAddresses(String s) {if (s.length() 12) return res;//进行剪枝操作如果长度大于12直接返回backtracking(s, 0);return res;}private void backtracking(String s, int startIndex) {if (pointNum 3) {//递归终止条件是加入了三个.if (isValid(s, startIndex, s.length() - 1)) {//看最后一个串是否合法res.add(s);}return;}for (int i startIndex; i s.length(); i) {if (isValid(s, startIndex, i)) {//合法就加入.s s.substring(0, i 1) . s.substring(i 1);pointNum;backtracking(s, i 2);//加入了一个.递归是i2s s.substring(0, i 1) s.substring(i 2);pointNum--;}else break;//如果这段不合法直接break}}private boolean isValid(String str, int head, int end) {//判断传入字符串的子串是否合法if (head end || end - head 2) return false;//注意head可能越界if (str.charAt(head) 0 end head) return false;//多位数且首位为0不合法int sum 0;for (int i head; i end; i) {if (str.charAt(i) 0 || str.charAt(i) 9) return false;//特殊字符不合法sum sum * 10 (str.charAt(i) - 0);if (sum 255) return false;//数大于255不合法}return true;}
}78.子集力扣题目链接给定一组不含重复元素的整数数组 nums返回该数组所有可能的子集幂集。说明解集不能包含重复的子集。示例: 输入: nums [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]思路这个题目重点在于子集没有固定长度所以每一次递归都加入res中即可先加入空然后path中加入1进入递归加入1然后path中加入2进入递归加入12...直到加入123结束这层递归弹出3结束这层递归弹出2加入3加入13...代码class Solution {ListListInteger res new ArrayList();LinkedListInteger path new LinkedList();public ListListInteger subsets(int[] nums) {if (nums null || nums.length 0) return res;backtracking(nums, 0);return res;}private void backtracking(int[] nums, int startIndex) {res.add(new ArrayList(path));if (startIndex nums.length) return;for (int i startIndex; i nums.length; i) {path.addFirst(nums[i]);backtracking(nums, i 1);path.removeFirst();}}
}90.子集II力扣题目链接给定一个可能包含重复元素的整数数组 nums返回该数组所有可能的子集幂集。说明解集不能包含重复的子集。思路和上题的区别是加上了去重的逻辑先对数组进行排序排序之后注意循环的时候如果是上层递归进来的第一次循环就直接加元素因为是第一个元素数量改变了如果不是第一个还和前一位一样那这个子集之前考虑过了就不用再看了代码class Solution {ListListInteger res new ArrayList();LinkedListInteger path new LinkedList();public ListListInteger subsetsWithDup(int[] nums) {if (nums null || nums.length 0) return res;Arrays.sort(nums);backtracking(nums, 0);return res;}private void backtracking(int[] nums, int startIndex) {res.add(new ArrayList(path));if (startIndex nums.length) return;for (int i startIndex; i nums.length; i) {if (i startIndex nums[i] nums[i - 1]) continue;//去重的逻辑在这里path.addFirst(nums[i]);backtracking(nums, i 1);path.removeFirst();}}
}