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

回溯算法(分割)

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.hqwc.cn/news/620853.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC:搭建第一个web项目并配置视图解析器

&#x1f449;需求&#xff1a;用spring mvc框架搭建web项目&#xff0c;通过配置视图解析器达到jsp页面不得直接访问&#xff0c;实现基本的输出“hello world”功能。&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb; 1 创建web项目 1…

Hello算法11:排序

https://www.hello-algo.com/chapter_sorting/ 选择排序 初始未排序的区间是[0,n-1]在[0,n-1]中查找最小元素&#xff0c;和索引0交换&#xff0c;此时未排序的区间是[1,n-1]在[1,n-1]中查找最小元素&#xff0c;和索引1交换&#xff0c;此时未排序区间是[2,n-1]以此类推&…

C++ PTA 天梯赛 L1-003 个位数统计 L1-005 考试座位号 【范围for循环】【. 与 -> 访问成员】

L1-003 个位数统计 最后一个测试点考察的是当N特别大时&#xff0c;如果用整数存会数据溢出&#xff0c;改成字符串可以增大范围 知识点&#xff1a; 1.范围 for 循环&#xff0c;它对于遍历容器&#xff08;比如字符串&#xff09;中的元素非常方便。在这里&#xff0c;N 是…

低频电磁仿真 | 新能源汽车性能提升的利器

永磁同步电机 新能源汽车的心脏 近年来&#xff0c;全球变暖的趋势日益加剧&#xff0c;极端天气事件层出不穷&#xff0c;这些现象都反映出当前气候形势的严峻性。为了应对这一全球性挑战&#xff0c;各国纷纷采取行动&#xff0c;制定了一系列降碳、减碳的措施。中国在2020年…

蓝桥杯 — — 纯质数

纯质数 题目&#xff1a; 思路&#xff1a; 一个最简单的思路就是枚举出所有的质数&#xff0c;然后再判断这个质数是否是一个纯质数。 枚举出所有的质数&#xff1a; 可以使用常规的暴力求解法&#xff0c;其时间复杂度为&#xff08; O ( N N ) O(N\sqrt{N}) O(NN ​)&…

【C++】哈希封装unordered_map和unordered_set

在前边的博客中我们已经实现了哈希表&#xff0c;我们又知道unordered_map和unordered_set就是用哈希表封装出来的&#xff0c;那么我们就自己来封装出它们&#xff0c;就跟之前用红黑树封装出set和map是一样的&#xff0c;我们这里使用哈希桶的版本 首先我们要用一个哈希表同时…

01-Git 之快速入门操作本地仓库

https://learngitbranching.js.org/?localezh_CN在线练习git 1. Git 安装好Git以后, 先检查是否已经绑定了用户名和邮箱 git config --list1.1 为什么要使用版本控制&#xff1f; 从个人角度&#xff1a; 在做项目时&#xff0c;如果一点点去改代码会很乱&#xff0c;不利…

《QT实用小工具·二十五》日志重定向输出

1、概述 源码放在文章末尾 日志重定向输出&#xff0c;包含如下功能&#xff1a; 支持动态启动和停止。支持日志存储的目录。支持网络发出打印日志。支持输出日志上下文信息比如所在代码文件、行号、函数名等。支持设置日志文件大小限制&#xff0c;超过则自动分文件&#xf…

免费插件集-illustrator插件-Ai插件-批量替换链接图

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行批量替换链接图。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&am…

ZISUOJ 数据结构-栈

题目列表&#xff1a; 问题 A: 数据结构-栈-括号匹配 思路&#xff1a; 遇到左半边括号&#xff0c;将其入栈&#xff0c;遇到右半边括号&#xff0c;则先判断栈是否为空&#xff0c;若为空&#xff0c;则匹配失败&#xff0c;若不为空&#xff0c;则再判断栈顶元素是否是与之匹…

宝塔面板部署腾讯云的域名

一、腾讯云&#xff0c;搜索我的证书&#xff0c;点击打开如图所示&#xff0c;点击下砸 二、点击宝塔的证书&#xff0c;然后下载到桌面 三、解压 四、打开宝塔&#xff0c;网站》自己的项目列表中要绑定的ssl 五、对应的文件内容复制进去&#xff0c;保存并启用证书 六、有了…

快速掌握Spring监控(Spring Boot admin)

监控 监控可视化监控平台Admin底层逻辑info 自定义端点 监控 监控的作用&#xff1a; 监控服务状态是否宕机监控服务运行指标&#xff08;内存&#xff0c;虚拟机&#xff0c;线程&#xff0c;请求等&#xff09;监控日志管理服务&#xff08;服务下线&#xff09; 监控的实…