复原IP地址
核心思路
-
也是用切割法, 只是切割完之后, 判断一下切割的元素是否符合ip地址的要求: 不以0开头、<=255
javapublic List<String> restoreIpAddresses(String s) { findIp(s, 0, 0, new StringBuilder()); return res; } private final List<String> res = new ArrayList<>(); public void findIp(String s, int index, int count, StringBuilder sb) { if (count > 4) { return; } if (count == 4 && index == s.length()) { res.add(sb.substring(0, sb.length() - 1)); return; } if (count == 4 && index < s.length()) { return; } for (int i = index; i < s.length(); i++) { String substring = s.substring(index, i + 1); if (isIp(substring)) { sb.append(substring); sb.append("."); count++; } else if (substring.length() > 3) { break; } else { continue; } findIp(s, i + 1, count, sb); sb.delete(sb.length() - substring.length() - 1, sb.length()); count--; } } private boolean isIp(String substring) { if (substring.length() > 3) { return false; } if (substring.charAt(0) == '0' && substring.length() > 1) { return false; } return Integer.parseInt(substring) <= 255; }
子集
核心思路
-
和切割类似, 只是终止条件变了
- 不是必须执行完整个数组才结束
- 如果说组合问题和分割问题都是找树的子节点, 那么子集就是找树的所有节点
JAVApublic List<List<Integer>> subsets(int[] nums) { findChild(nums, 0, new ArrayList<>()); return subsetsRes; } private List<List<Integer>> subsetsRes = new ArrayList<>(); public void findChild(int[] nums, int index, List<Integer> list) { subsetsRes.add(new ArrayList<>(list)); for (int i = index; i < nums.length; i++) { int cur = nums[i]; list.add(cur); findChild(nums, i + 1, list); list.removeLast(); } }
子集2
核心思路
-
就是子集+组合2的used逻辑
-
记得排序
javaprivate List<List<Integer>> subsetsRes = new ArrayList<>(); public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); findChild1(nums, 0, new ArrayList<>(), new int[nums.length]); return subsetsRes; } public void findChild1(int[] nums, int index, List<Integer> list, int[] used) { subsetsRes.add(new ArrayList<>(list)); for (int i = index; i < nums.length; i++) { if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0) { continue; } int cur = nums[i]; list.add(cur); used[i] = 1; findChild1(nums, i + 1, list, used); list.removeLast(); used[i] = 0; } }