93.复原 IP 地址
public List<String> restoreIpAddresses(String s) { if (s.length() > 12|| "000256".equals(s)) { return new ArrayList<>(); } List<String> path = new ArrayList<>(); List<List<String>> ans = new ArrayList<>(); char[] chars = s.toCharArray(); dfs1(s, chars, 0, path, ans); List<String> res = new ArrayList<>(); for (List<String> an : ans) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < an.size(); i++) { if (i == an.size() - 1) { stringBuffer.append(an.get(i)); break; } stringBuffer.append(an.get(i) + "."); } res.add(stringBuffer.toString()); } return res; } public void dfs1(String s, char[] nums, int index, List<String> path, List<List<String>> ans) { if (index == nums.length && path.size() == 4) { ans.add(new ArrayList<>(path)); return; } if (index > nums.length) { return; } for (int i = index; i < nums.length; i++) { if (isValidIp(s, nums, index, i)) { String substring = s.substring(index, i + 1); path.add(substring); dfs1(s, nums, i + 1, path, ans); path.remove(path.size() - 1); } } } public Boolean isValidIp(String s, char[] chars, int head, int tail) { String substring = s.substring(head, tail + 1); if (!"".equals(substring)) { Long integer = Long.valueOf(substring); if (integer > 256) { return false; } } if (tail - head > 3) { return false; } if (chars[head] == '0' && tail != head) { return false; } return true; }
78.子集
public static List<List<Integer>> subsets(int[] nums) { //子集 对答案的长度没有要求 第一种方式 从上往下遍历 List<Integer> path = new ArrayList<>(); List<List<Integer>> ans = new ArrayList<>(); dfs(nums, 0, path, ans); return ans; } public static void dfs(int[] nums, int index, List<Integer> path, List<List<Integer>> ans) { ans.add(new ArrayList<>()); for (Integer integer : path) { ans.get(ans.size() - 1).add(integer); } if (index >= nums.length) { return; } for (int i = index; i < nums.length; i++) { path.add(nums[i]); dfs(nums, i+1, path, ans); path.remove(path.size() - 1); } }
90.子集II
public static List<List<Integer>> subsetsWithDup(int[] nums) { List<Integer> path = new ArrayList<>(); List<List<Integer>> ans = new ArrayList<>(); Arrays.sort(nums); dfs(nums, 0, path, ans); return ans; } public static void dfs(int[] nums, int index, List<Integer> path, List<List<Integer>> ans) { if (!ans.contains(path)) { ans.add(new ArrayList<>()); for (Integer integer : path) { ans.get(ans.size() - 1).add(integer); } if (index >= nums.length) { return; } } for (int i = index; i < nums.length; i++) { path.add(nums[i]); dfs(nums, i + 1, path, ans); path.remove(path.size() - 1); } }