【算法系列之回溯算法】leetcode131.分割回文串
创始人
2025-06-01 16:59:01

39. 组合总和

力扣题目链接

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

解题思路

  1. 优化手段,先排序。在遍历的时候,可以判断 if (sum + candidates[i] > target) break;
  2. res.add(new ArrayList<>(path));,添加到结果集的时候,要新创建数组,否则引用会被接下来的代码逻辑处理。

Java实现

class Solution_LC39 {List> res = new ArrayList<>();LinkedList path = new LinkedList<>();public List> combinationSum(int[] candidates, int target) {backtrack(candidates, target, 0, 0);return res;}private void backtrack(int[] candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum == target) {res.add(new ArrayList<>(path));return;}for (int i = startIndex; i < candidates.length; i++) {sum += candidates[i];path.add(candidates[i]);backtrack(candidates, target, sum, i);sum -= candidates[i];path.removeLast();}}}

40.组合总和II

力扣题目链接

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次

**注意:**解集不能包含重复的组合。

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

解题思路

  1. 允许结果集里面数是一样的,但是索引不一样。核心就是将候选数组进行排序,判断i > startIndex && candidates[i] == candidates[i - 1]i > startIndex实现了回溯的当前轮的首位元素可以和上一轮是相同的。如果元素在第一轮中已经选中了1,在下一个轮次是可以继续选择1的,因为数组中存在两个1。candidates[i] == candidates[i - 1]这个是用来跳过轮次的,因为选择到1,2,7,会选择同一轮次中的1两次。
  2. 不能使用HashSet进行去重,因为元素1在数组中出现两次,就意味着在结果集中可以出现两个1。

Java实现

class Solution {List> res = new ArrayList<>();LinkedList path = new LinkedList<>();public List> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);backtrack(candidates, target, 0, 0);return res;}private void backtrack(int[] candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum == target) {res.add(new ArrayList<>(path));return;}for (int i = startIndex; i < candidates.length; i++) {if (i > startIndex && candidates[i] == candidates[i - 1]) {continue;}sum += candidates[i];path.add(candidates[i]);backtrack(candidates, target, sum, i + 1);sum -= candidates[i];path.removeLast();}}
}

131.分割回文串

力扣题目链接

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

解决思路

  1. 判断字符串是否回文,根据双指针
  2. 字符串切分,startIndex是起始位置,i是终止位置,substring(start,end)是不包含末尾字符的。

Java实现

class Solution_LC131 {List> res = new ArrayList<>();LinkedList path = new LinkedList<>();public List> partition(String s) {backtrack(s, 0);return res;}private void backtrack(String s, int startIndex) {if (startIndex == s.length()) {res.add(new ArrayList<>(path));return;}for (int i = startIndex; i < s.length(); i++) {if (isPalindrome(s, startIndex, i)) {String str = s.substring(startIndex, i + 1);path.add(str);backtrack(s, i + 1);path.removeLast();}}}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;}
}

93.复原IP地址

力扣题目链接

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" "192.168.1.1"有效 IP 地址,但是 "0.011.255.245""192.168.1.312""192.168@1.1"无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

解决思路

  1. isValid用来判断字符串是否有效,当数字不超过255,数字不是0,是不能用0开头的,数字的所有字符不能大于9和小于0。字符串转换数字。
  2. 终止条件,当切割字符串正好为4且start等于s.length,回收结果集。
  3. 回溯方法中参数增加切割次数
  4. 回溯单层逻辑中,片段累增,结果集拼接字符串,增加分隔字符。回溯的逻辑:stringBuilder.delete(start + segNum, i + segNum + 2);,因为字符串是不断变化的,会添加.。且删除字符串是删除i-start长度的字符串,需要计算因为分隔segment,需要添加的分隔字符数,且回溯的时候还要删除一个字符数。

Java实现

class Solution_LC93 {List res = new ArrayList<>();StringBuilder stringBuilder = new StringBuilder();public List restoreIpAddresses(String s) {backtrack(s, 0, 0);return res;}private void backtrack(String s, int start, int segNum) {if (start == s.length() && segNum == 4) {res.add(stringBuilder.toString());return;}if (start == s.length() || segNum == 4) {return;}for (int i = start; i < s.length()& i - start < 3; i++) {if (isValid(s, start, i)) {stringBuilder.append(s.substring(start, i + 1));segNum++;if (segNum < 4) {stringBuilder.append(".");}backtrack(s, i + 1, segNum);segNum--;stringBuilder.delete(start + segNum, i + segNum + 2);}}}private Boolean isValid(String s, int start, int end) {if (start > end) {return false;}if (s.charAt(start) == '0' && start != end) {return false;}int num = 0;for (int i = start; i <= end; i++) {char c = s.charAt(i);if (c > '9' || c < '0') {return false;}num = num * 10 + s.charAt(i) - '0';if (num > 255) {return false;}}return true;}
}

78.子集

力扣题目链接

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

解决思路

  1. 在每一个回溯中都进行回收结果集
  2. startIndex:获取数组起始元素的索引。

Java实现

public class Solution_LC78 {List> res = new ArrayList<>();LinkedList path = new LinkedList<>();public List> subsets(int[] nums) {backtrack(nums, 0);return res;}private void backtrack(int[] nums, int startIndex) {res.add(new ArrayList<>(path));if (startIndex == nums.length) {return;}for (int i = startIndex; i < nums.length; i++) {path.add(nums[i]);backtrack(nums, i + 1);path.removeLast();}}}

在这里插入图片描述

相关内容

热门资讯

6.3股市早8点丨三天假发生了... 三天假发生了啥事?股市早8点 老沙自媒体2025年6月3日(周二)每日大道正道消息▊美股小涨北京时间...
绿通科技:拟现金收购大摩半导体... 【绿通科技筹划收购大摩半导体不低于51%股权】6月2日晚间,绿通科技公告,筹划现金收购江苏大摩半导体...
股市必读:爱博医疗(68805... 截至2025年5月30日收盘,爱博医疗(688050)报收于71.41元,下跌1.76%,换手率1....
销售会“提问”,再冷淡的客户,... 回复“9”限时领《9套销售话术资料包》 作者:Dora 在销售咨询过程中,“高效提问”不仅是获取客户...
原创 德... 2025年2月24日,恰逢俄乌冲突爆发三周年,德国也于前一天举行了新一轮的议会选举。在过去的三年中,...
明天沪主板新股海阳科技申购!聚... 明天,沪主板将迎来一家新股申购! 格隆汇获悉,海阳科技(603382)于6月3日申购,发行价格为11...
三一重工、山推股份谋求赴港上市... 本报(chinatimes.net.cn)记者李贝贝 上海报道工程机械龙头企业纷纷瞄准港股市场:5月...
2024跨境电商平台出海目的地... 今天分享的是:2024跨境电商平台出海目的地中东市场:行业呈现三足鼎立态势,物流和支付是竞争关键 报...
虎嗅【作·嗅之星】周榜第264... 作·嗅之星榜单,以周榜的形式,呈现每周新鲜出炉的优秀作品。2025年5月23日~2025年5月29日...
原创 美... 尊敬的审阅人员和品鉴读者:本文是经过严格查阅相关权威文献和资料。 全文数据有据可依,可供查证。 美...
原创 美... 前言 中国商务部那间熟悉的发布厅里,发言人拿出一摞资料,语气格外严肃。 说好了一起守规矩,结果呢?...
原创 节... 不出意外,大家的仓位越来越轻了。 如果目前的位置是今年的顶部,为什么要想方设法驱赶散户离场呢?大家都...
美股下跌,钢铁股大涨!金价重回... 6月2日,美国三大股指开盘走低,截至22:40发稿,道指跌0.5%,标普500指数跌0.25%,纳斯...
深康佳A:拟择机出售武汉天源不... 新京报贝壳财经讯 深康佳A6月2日晚间公告,目前公司持有武汉天源(301127)股份合计8618.4...
深夜,利空!直线跳水! 深夜利... 美国经济传来利空信号。今晚,美股三大指数盘初集体跳水,道指一度跌超1%。消息面上,ISM公布的数据显...
这个账单,决定后半辈子幸福… ... 图:Hiroki Kawanabe 第一波延迟退休的人出来了。 挺多人晒出来的退休年龄数字,已经有零...
国际金价年内上涨超25%5月纳... 【#国际金价年内上涨超25%##5月纳指涨幅接近10%#】首先来看美股上周交易的情况。受美欧贸易谈判...
深夜!美股下跌,黄金白银原油飙... 北京时间6月2日晚间,美股低开低走。截至22:02,道琼斯跌0.89%,纳斯达克跌0.51%,标普5...
德国银行高管:美政府政策频繁变... 根据德国《商报》6月2日刊发的专访文章,德国国家开发银行复兴信贷银行董事会主席斯特凡·温特尔斯指出,...
理想一季度销量、营收同比有所增... 理想汽车公布2025年第一季度财报。财报显示,第一季度,公司实现营收259亿元,同比增长1.1%;净...
科技破局、全链升级:澳优四大羊... 人们所熟悉的羊奶资源,除了应用在配方奶以外,还有哪些新应用?羊奶的产业化,有哪些技术瓶颈有待突破? ...
靠卖丸子年入百亿,拿下10万家... 订阅 快刀财经 ▲ 做您的私人商学院一粒鱼丸的逆袭史。作者:朱末来源:快刀财经(ID:kuaidao...
每30秒卖一辆,老牌车企在海外... 你还记得“奇瑞QQ”吗?今年又又又打算上市那个。这张国产汽车销量逆袭并称霸海外的成绩单上,奇瑞是MV...
“近视神药”跌下神坛,“眼药大... “近视神药”能成为百亿大药吗??作者 | 赵普编辑丨高岩来源 | 野马财经在眼药领域,尤其是备受瞩目...
棕榈油、豆油、菜油:供给预期双... 【油脂市场供需及价差情况分析】棕榈油方面,产地预估产量环比走高,季节性增产临近,供给预期增加。国内港...
这届高考,仍是史上最难 史上最... 作者 |暴雨再过几天,我们会迎来历史上最难的一届高考。你可能会反驳,1335万名考生,比去年少了7万...
关键时刻,日美关系出现重大转折... 作者 | 无疆编辑 | 剑书日 美关系出现一个重大转折,影响可能不亚于贸易协议。就在最近,曾被拜登坚...
深圳半山巨宅底价成交,3749... “老李,听说了吗?大鹏那栋别墅被人底价捡走了!” “真的假的?那个叶老板花大钱建的城堡,现在才卖三千...
郑商所就丙烯期货和期权合约及期... 5月30日,郑州商品交易所就丙烯期货和期权合约及期货业务细则公开征求意见。这意味着我国产量最大的烯烃...
上涨!金饰价格重回1000元大... 随着国际黄金价格上涨,国内金饰价格重新升至每克千元以上。 6月2日,老凤祥金饰品为1000元/克,这...