当前位置: 首页 > ds >正文

Day23--回溯--39. 组合总和,40. 组合总和 II,131. 分割回文串

Day23–回溯–39. 组合总和,40. 组合总和 II,131. 分割回文串

39. 组合总和

思路:

递归法(回溯)。因为可以重复取,所以下一层的startIndex还是i,sum要加上本层元素的值

// 递归法(回溯)。因为可以重复取,所以下一层的startIndex还是i,sum要加上本层元素的值
class Solution {// 结果集List<List<Integer>> res = new ArrayList<>();// 路径上的元素List<Integer> path = new ArrayList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {backtracking(candidates, target, 0, 0);return res;}// 要有startIndex才能知道下一层从哪里开始,要有sum,才知道路径上的和有多少private void backtracking(int[] nums, int target, int startIndex, int sum) {// sum超出了,返回if (sum > target) {return;}// sum 刚好,加入结果集if (sum == target) {res.add(new ArrayList(path));}for (int i = startIndex; i < nums.length; i++) {// 加入本层节点path.add(nums[i]);// 注意,因为可以重复取,所以下一层的startIndex还是i,sum要加上本层元素的值backtracking(nums, target, i, sum + nums[i]);// 回溯path.remove(path.size() - 1);}}
}

40. 组合总和 II

与39. 组合总和不同的是,要去重。其一是不能重复取值,其二是不能有重复的集合。前者可以想象成:startIndex+1传到下一层;后者的意思是,同一层的相同元素不能重复取。

思路:

  • 递归法(回溯)。因为不可以重复取,所以下一层的startIndex是 i+1 ,sum要加上本层元素的值
  • 注意:解集不能包含重复的组合。 ——重点在于去重
  • 去重:每一层不能重复取相同的元素——解决办法:先排序,然后nums[i]!=nums[i-1]
// 递归法(回溯)。因为不可以重复取,所以下一层的startIndex是 i+1 ,sum要加上本层元素的值
// 注意:解集不能包含重复的组合。 ——重点在于去重
// 去重:每一层不能重复取相同的元素——解决办法:先排序,然后nums[i]!=nums[i-1]
class Solution {// 结果集List<List<Integer>> res = new ArrayList<>();// 路径上的元素List<Integer> path = new ArrayList<>();public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);backtracking(candidates, target, 0, 0);return res;}// 要有startIndex才能知道下一层从哪里开始,要有sum,才知道路径上的和有多少private void backtracking(int[] nums, int target, int startIndex, int sum) {// sum超出了,返回if (sum > target) {return;}// sum 刚好,加入结果集if (sum == target) {res.add(new ArrayList(path));}for (int i = startIndex; i < nums.length; i++) {// 对于同一层的元素,去重。if (i > startIndex && nums[i] == nums[i - 1]) {continue;}// 加入本层节点path.add(nums[i]);// 注意,因为不可以重复取,所以下一层的startIndex是 i+1 ,sum要加上本层元素的值backtracking(nums, target, i + 1, sum + nums[i]);// 回溯path.remove(path.size() - 1);}}
}

131. 分割回文串

思路:

太晕了。绕晕了。回头二刷再做。

public class Solution {private List<List<String>> result = new ArrayList<>();private List<String> path = new ArrayList<>(); // 存储当前已经找到的回文子串// 主方法,返回所有可能的回文分割方案public List<List<String>> partition(String s) {backtracking(s, 0);return result;}// 回溯算法private void backtracking(String s, int startIndex) {// 如果起始位置已经超出字符串长度,说明找到一组组分割方案if (startIndex >= s.length()) {result.add(new ArrayList<>(path));return;}for (int i = startIndex; i < s.length(); i++) {// 检查从startIndex到i的子串是否是回文if (isPalindrome(s, startIndex, i)) {// 获取子串并加入路径String str = s.substring(startIndex, i + 1);path.add(str);} else {// 不是回文,跳过continue;}// 递归处理下一个位置backtracking(s, i + 1);// 回溯,移除最后添加的子串path.remove(path.size() - 1);}}// 检查子串是否是回文private boolean isPalindrome(String s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {if (s.charAt(i) != s.charAt(j)) {return false;}}return true;}
}
http://www.xdnf.cn/news/17100.html

相关文章:

  • SQL 地理空间原理与实现
  • GLM-4.5 解读:统一推理、编码与智能体的全能王
  • PYTHON从入门到实践-18Django模版渲染
  • 电力电子技术知识总结-----PWM知识点
  • OS21.【Linux】环境变量
  • 第八章:进入Redis的SET的核心
  • adb 与pad 交互方法
  • [每周一更]-(第154期):Docker 底层深度剖析:掌控 CPU 与内存资源的艺术
  • idea中.xml文件的块注释快捷键
  • Suno的100个高质量歌词元标签(MetaTags)详解与使用指南
  • 网安-逻辑漏洞-23登陆验证
  • 文明存续的时间博弈:论地球资源枯竭临界期的技术突围与行动紧迫性
  • lua中 list.last = last 和list[last]=value区别
  • 悬挂的绳子,它的函数方程是什么样子的?
  • HiveMQ 2024.9 设计与开发文档
  • Android 之 MVVM架构
  • 大语言模型的解码策略:贪婪解码与波束搜索
  • [硬件电路-133]:模拟电路 - 信号处理电路 - 电荷放大器概述、工作原理、常见芯片、管脚定义
  • 使用ASIWebPageRequest库编写Objective-C下载器程序
  • 动感按钮:如何打造交互感十足的点击动画效果
  • Python-初学openCV——图像预处理(五)
  • GitHub 趋势日报 (2025年08月02日)
  • 机器学习第四课之决策树
  • C++-二叉树OJ题
  • 分布式文件系统05-生产级中间件的Java网络通信技术深度优化
  • ubuntu24.04安装selenium、edge、msedgedriver
  • Leetcode 12 java
  • 2.0 vue工程项目的创建
  • C++:STL中的栈和队列的适配器deque
  • 8.1.3 TiDB集群方案雨Replication原理