算法训练营第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.mfbz.cn/a/555247.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3D模型查看器开发实战【WebGL】

本文介绍如何从头开发一个包含3D 模型查看器的页面 - 尽管它非常简单&#xff0c;但你将学习的步骤也应该有助于构建其他类型的 Web 应用程序。 在自己的网站或博客里展示3D模型更简单的方式是使用NSDT 3DConvert提供的在线服务&#xff0c;无需任何开发工作&#xff0c;5分钟…

简单3步制作纸质英语绘本的mp3英语朗读音频

孩子学英语&#xff0c;需要看很多英语绘本&#xff0c;而且要听配套的音频。但有些英语绘本是没有对应音频的&#xff0c;下面简单三步&#xff0c;就可以将任意英语绘本制作出对应的英语朗读音频。 第一步&#xff0c;手机拍照做成PDF文件&#xff1a; 绘本每一页拍照后&…

模拟量化面试20问回答

原文链接 参考链接 量化的基本公式 对称均匀量化&#xff08;symmetric uniform quantization&#xff09; 对称量化将零点z限制为真实的0。注意对称均匀量化并不是关于零点对称。它还分为有符号和无符号。 signed量化公式 signed量化范围 8bit量化范围[-128, 127] signe…

使用python进行网站答题操作

介绍&#xff1a; 使用Python和DrissionPage模块编写自动化脚本&#xff0c;以模拟人的行为访问网站并获取题目答案进行自动答题。这个脚本似乎是为答题网站设计的&#xff0c;通过监控特定数据包地址来获取题目答案&#xff0c;并模拟点击正确答案进行答题。 代码中的逻辑包…

List实现(2)| LinkedList

参考&#xff1a;LinkedList 源码分析 在Java中&#xff0c;LinkedList是一个双向链表&#xff0c;实现了List和Deque接口&#xff0c;可以被当作列表&#xff08;List&#xff09;、队列&#xff08;Queue&#xff09;或者双端队列&#xff08;Deque&#xff09;使用。它允许…

[渗透测试学习] TwoMillion-HackTheBox

TwoMillion-HackTheBox 信息搜集 nmap扫描一下 nmap -sV -v 10.10.11.221扫描结果 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0) 80/tcp open http nginx 3851/tcp f…

LeetCode第797题: 所有可能的路径

目录 1.问题描述 2.问题分析 1.问题描述 给你一个有 n 个节点的有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09;。 graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08…

解决IDEA https://start.spring.io/连接不上

1.换成下边这个地址试试 https://start.springboot.io/2.换成阿里云试试&#xff0c;绝对可行&#xff0c;但是版本有点低 https://start.aliyun.com

使用Java调用音乐开放API,并进行播放

使用Java调用音乐开放API&#xff0c;并进行播放 背景描述 电脑没有下载音乐软件&#xff0c;使用网页播放又不太方便&#xff0c;所有就想着使用Java语言直接调用音乐开放API&#xff0c;然后进行播放音乐。 具体代码如下&#xff0c;包含了注释 package com.lowkey.comple…

python学习笔记B-06:序列结构之列表--列表的创建和删除

序列结构主要有列表、元组、字典、集合和字符串&#xff0c;列表是要学习的第一种序列结构。下面是列表的创建和删除方法。 import random #导入一个随机数发生器 print("创建列表方法1&#xff1a;直接列表名&#xff0c;等号&#xff0c;方括号中间内容用逗号隔开&quo…

基于小程序实现的精准扶贫数据收集系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

python将xml格式文件转成png或者pdf格式

本文主要介绍运行NCCL代码时输出的xml文件该如何转成更加容易观看的图格式 如下是举例&#xff0c;服务器上的PCIE相关的topo xml 文件 <system version"1"><cpu numaid"1" affinity"ffffff00,0000ffff,ff000000" arch"x86_64&q…

AWB学习记录

主要参考食鱼者博客&#xff1a;https://blog.csdn.net/wtzhu_13/article/details/119301096&#xff0c;以及相关的论文&#xff0c;感谢食鱼者老师整理分享。 灰度世界和完全反射 灰度世界法和完全反射法分别是基于(Rmean, Gmean, Bmean)和(Rmax, Gmax, Bmax)来进行白平衡校…

内部类

一.概念 当一个事物内部&#xff0c;还有一个部分需要一个完整的结构进行描述&#xff0c;而这个内部的完整的结构又只为外部事物提供服务&#xff0c;那么将这个内部的完整结构最好使用内部类。在Java中&#xff0c;可以将一个类定义在另一个类或者一个方法内部&#xff0c;前…

第46篇:随机存取存储器(RAM)模块<五>

Q&#xff1a;本期我们使用Quartus软件的IP Catalog工具创建双端口RAM。 A&#xff1a;前期创建的RAM存储模块只有一个端口&#xff0c;同时为读/写操作提供地址。我们将再创建一个具有两个地址输入端口的RAM模块&#xff0c;分别为读操作和写操作提供地址。选择Basic Functio…

2000-2022年各省人力资本水平数据(含原始数据+计算过程+计算结果)(无缺失)

2000-2022年各省人力资本水平数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;普通高等学校在校学生数(万人)、年末常住人口&#xff08;万人&#xff09;、人力资本水平 4、范…

网络编程day6

#include <myhead.h> void Insert_Record(sqlite3* ppDb); // 插入记录 void Delete_Record(sqlite3* ppDb); // 删除记录 void Update_Record(sqlite3* ppDb); // 修改记录 int main(int argc, const char *argv[]) { //1、定义一个数据库句柄指针sqlite3 * ppDb NULL;…

面试经典150题——相同的树

​ 1. 题目描述 2. 题目分析与解析 要编写一个判断两棵二叉树是否完全相同的代码&#xff0c;首先需要理解何谓“完全相同”的二叉树。完全相同意味着两棵树的结构完全一致&#xff0c;并且所有对应的节点上的值也必须相同。 1. 定义问题 首先明确问题定义&#xff1a;给定…

RC4Drop加密技术:原理、实践与安全性探究

title: RC4Drop加密技术&#xff1a;原理、实践与安全性探究 date: 2024/4/18 20:47:30 updated: 2024/4/18 20:47:30 tags: RC4算法流加密安全性RC4Drop技术密钥流加密解密网络通信 第一章&#xff1a;介绍 1.1 加密技术的重要性 加密技术在当今信息社会中扮演着至关重要的…

R语言计算:t分布及t检验

t分布理论基础 t分布也称Student’s t-distribution&#xff0c;主要出现在小样本统计推断中&#xff0c;特别是当样本量较小且总体标准差未知时&#xff0c;用于估计正态分布的均值。其定义基于正态分布和 X 2 X^{2} X2分布&#xff08;卡方分布&#xff09;。如果随机变量X服…
最新文章