算法训练营第25天回溯(分割)

devtools/2024/10/22 16:45:55/

回溯算法(分割)

131.分割回文串

力扣题目链接(opens new window)

题目

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]

解答

在这里插入图片描述

每一个for都是一行

每个递归都是一个树枝

1.for

for (int i = index; i < s.length(); i++) {path.add(s.substring(index,i + 1));

表示每次的切割方案,对于深度相同的一层,切割的起始位置不变,截取长度不同,即第一次for截取a,第二层for截取aa,第三层for截取aab

2.递归

backtracking(s, i+1);

切割当前的之后,再切割剩余的字符串

3.回溯

path.removeLast();只要当前程序终止,表示切割完毕或者切割失败,就要回溯到上一层重新切割

4.终止条件

		if (!path.isEmpty() && !isPalindrome(path.getLast()))return;//如果新加入的并不是回文串,就终止,即错误切割的终止条件,当前的切割方案并不合适if (index >= s.length()){results.add(new ArrayList<>(path));return;}//深度达到最深的终止条件,即成功切割的终止条件

完整代码

class Solution {List<List<String>> results = new ArrayList<>();LinkedList<String> path = new LinkedList<>();public List<List<String>> partition(String s) {backtracking(s,0);return results;}void backtracking(String s,int index){if (index >= s.length()){results.add(new ArrayList<>(path));return;}//深度达到最深的终止条件,即成功切割的终止条件for (int i = index; i < s.length(); i++) {//横向切割,每个for都是一种切割方案,即横向遍历String subs = s.substring(index,i+1);if (isPalindrome(subs)){path.add(s.substring(index,i + 1));backtracking(s, i+1);//纵向遍历path.removeLast();}}}private boolean isPalindrome(String s){int startIndex = 0;int endIndex = s.length() - 1;while (startIndex <= endIndex){if (s.charAt(startIndex) != s.charAt(endIndex))return false;startIndex++;endIndex--;}return true;}
}

93.复原IP地址

力扣题目链接(opens new window)

题目

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

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

例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。

示例 1:

  • 输入:s = “25525511135”
  • 输出:[“255.255.11.135”,“255.255.111.35”]

示例 2:

  • 输入:s = “0000”
  • 输出:[“0.0.0.0”]

示例 3:

  • 输入:s = “1111”
  • 输出:[“1.1.1.1”]

示例 4:

  • 输入:s = “010010”
  • 输出:[“0.10.0.10”,“0.100.1.0”]

示例 5:

  • 输入:s = “101023”
  • 输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]

提示:

  • 0 <= s.length <= 3000
  • s 仅由数字组成

解答

在这里插入图片描述

主要是终止条件

  1. 如果ip已经>4,就没有继续的必要,该树枝结束if (ip.size() > 4) return;
  2. 如果加入的数字比225大,也可以结束if (!ip.isEmpty() && Integer.parseInt(ip.getLast()) > 255) return;
  3. 如果加入的字符串有超过两位并且第一位为0,也就结束if (!ip.isEmpty() && ip.getLast().length() > 1 && ip.getLast().charAt(0) == '0')
  4. 因为每次的startIndex都是i + 1,而i + 1恰巧是这一轮的startIndex,那么如果i + 1恰好为s.length(),也就表示刚好到达了末尾并且ip有四位,完美的结束if (ip.size() == 4 && startIndex == s.length())
  5. for中的i < s.length() && i - startIndex < 3相当于剪枝,因为截取的长度最大也就只有三个
class Solution {List<String> results = new ArrayList<>();LinkedList<String> ip = new LinkedList<>();public List<String> restoreIpAddresses(String s) {if (s.length() > 3 && s.length() < 13)backtracking(s,0);return results;}void backtracking(String s,int startIndex){if (ip.size() > 4) return;if (!ip.isEmpty() && Integer.parseInt(ip.getLast()) > 255) return;if (!ip.isEmpty() && ip.getLast().length() > 1 && ip.getLast().charAt(0) == '0') return;if (ip.size() == 4 && startIndex == s.length()){StringBuilder result = new StringBuilder();for (int i = 0; i < ip.size() - 1; i++) {result.append(ip.get(i)).append(".");}result.append(ip.getLast());results.add(result.toString());return;}for (int i = startIndex; i < s.length() && i - startIndex < 3; i++) {String subs = s.substring(startIndex,i+1);ip.add(subs);backtracking(s,i+1);ip.removeLast();}}
}

http://www.ppmy.cn/devtools/5964.html

相关文章

pt-archiver归档表数据

一 介绍 pt-archiver的原理主要是根据定义的时间间隔(sleep参数)&#xff0c;扫描要清理的数据表。它按照指定的规则分批(limit参数)将查询到的记录转移到其他表或文件中&#xff0c;发现它是按主键去删除的表数据&#xff0c;对数据库影响很小。 二 语法 /bin/pt-archiver …

Google Earth Engine 洪水制图 - 使用 Sentinel-1 SAR GRD

Sentinel-1 提供从具有双极化功能的 C 波段合成孔径雷达 (SAR) 设备获得的信息。该数据包括地面范围检测 (GRD) 场景,这些场景已通过 Sentinel-1 工具箱进行处理,以创建经过校准和正射校正的产品。该集合每天都会更新,新获得的资产会在可用后两天内添加。 该集合包含所有 G…

系统服务控制

系统服务控制 格式&#xff1a;systemctl 控制类型 服务名称 控制类型 start:启动stop:停止restart:重新启动reload:重新加载status :查看服务状态 例&#xff1a; systemctl status firewalld //显示防火墙状态 systemctl stop firewalld.service //关闭防火墙…

WPF Extended.Wpf.Toolkit 加载界面

1、NuGet 中安装 Extended.Wpf.Toolkit 。 2、在MainWindow.xaml中添加xmlns:tk"http://schemas.xceed.com/wpf/xaml/toolkit" 。 MainWindow.xaml 代码如下。 <Window x:Class"WPF_Extended_Wpf_Toolkit_Loading.MainWindow" xmlns"ht…

近端安全互联样例使用指导

样例介绍 本样例基于rk3568开发板&#xff0c;通过封装openharmony安全子系统deviceauth组件提供的能力&#xff0c;实现了一组可用于设备间快速建立可信认证和连接的接口&#xff0c;通过预先定义关系网&#xff0c;在设备初始化阶段完成端端设备间的认证&#xff0c;构建安全…

CSS3 伪元素与伪类选择器区别、详解与应用实例

伪元素与伪类两者都是通过在选择器后附加一个特定的关键字来定义&#xff0c;遵循相似的语法规则&#xff0c;并在 CSS 规则块中设置相应的样式。伪元素 能够通过 content 属性添加或替换内容。例如&#xff0c;:before 和 :after 可以插入文本、图像或其他生成的内容。伪类 仅…

Spark-机器学习(3)回归学习之线性回归

在之前的文章中&#xff0c;我们了解我们的机器学习&#xff0c;了解我们spark机器学习中的特征提取和我们的tf-idf&#xff0c;word2vec算法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你…

某零售企业招聘管理体系搭建咨询项目

科学岗位分析&#xff0c;改善招聘流程&#xff0c;提高招聘及时率随着公司不断发展壮大&#xff0c;企业规模逐渐增大&#xff0c;部门设置也日益增多&#xff0c;因此对人员的需求也日益提高。但是目前该企业在人员招聘方面逐渐暴露出一些诸如岗位分析不到位、缺乏整体面试计…