No.1
题目
复原IP地址
思路
- 写一个函数,判断是否是有效的IP地址元素(即两点之间的部分是否合法)
- 这是一个分割问题
- 回溯法
递归分析
- 全局变量:``List path
,
List result`
- 返回值:空,参数:原始字符串,
startIndex
- 终止条件
- 字符串用光了,且
path
有4个元素,存储结果,返回
- 单层递归逻辑
- 处理当前节点
- 如果合法,且
path
不超过4个成员,进入下层递归
- 回溯,抛出当前节点
代码
| public boolean judger(String str) { |
| int len = str.length(); |
| |
| if (len > 3) |
| return false; |
| |
| if (len > 1 && str.indexOf("0") == 0) |
| return false; |
| |
| if (Integer.parseInt(str) > 255) |
| return false; |
| |
| return true; |
| } |
| |
| private List<String> path; |
| private List<String> result; |
| |
| public void restoreHelper(String s, int startIndex) { |
| if (startIndex >= s.length() && path.size() == 4) { |
| StringBuilder sb = new StringBuilder(); |
| for (String value : path) { |
| sb.append(value); |
| sb.append("."); |
| } |
| sb.deleteCharAt(sb.length() - 1); |
| result.add(sb.toString()); |
| } |
| |
| for (int i = startIndex; i < s.length(); i++) { |
| String subStr = s.substring(startIndex, i + 1); |
| if (path.size() < 4) { |
| path.add(subStr); |
| if (judger(subStr)) |
| restoreHelper(s, i + 1); |
| path.remove(path.size() - 1); |
| } |
| } |
| } |
| |
| public List<String> restoreIpAddresses(String s) { |
| path = new ArrayList<>(); |
| result = new ArrayList<>(); |
| |
| restoreHelper(s, 0); |
| return result; |
| } |
No.2
题目
子集
思路
- 回溯法
- 首先要对数组排序
- 和之前的组合收集叶子节点不同,这里要收集树的所有节点,所以递归退出的地方没有任何操作,而在每次节点更新后,同步更新
result
代码
| private List<Integer> path; |
| private List<List<Integer>> result; |
| |
| public void subsetHelper(int[] nums, int startIndex) { |
| if (startIndex >= nums.length) |
| return; |
| |
| for (int i = startIndex; i < nums.length; i++) { |
| path.add(nums[i]); |
| result.add(new ArrayList<>(path)); |
| subsetHelper(nums, i + 1); |
| path.remove(path.size() - 1); |
| } |
| } |
| |
| public List<List<Integer>> subsets(int[] nums) { |
| path = new ArrayList<>(); |
| result = new ArrayList<>(); |
| result.add(new ArrayList<>()); |
| |
| Arrays.sort(nums); |
| subsetHelper(nums, 0); |
| return result; |
| } |
No.3
题目
子集 II
思路
- 回溯法
- 稍微精简了代码
- 输入存在重复元素,要排序后去重
代码
| private List<Integer> path; |
| private List<List<Integer>> result; |
| |
| public void subsetHelper(int[] nums, int startIndex) { |
| result.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.add(nums[i]); |
| subsetHelper(nums, i + 1); |
| path.remove(path.size() - 1); |
| } |
| } |
| |
| public List<List<Integer>> subsetsWithDup(int[] nums) { |
| path = new ArrayList<>(); |
| result = new ArrayList<>(); |
| |
| Arrays.sort(nums); |
| subsetHelper(nums, 0); |
| return result; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人