LeetCode——回溯篇(二)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com

目录

131. 分割回文串

93. 复原 IP 地址

78. 子集

90. 子集 II

491. 递增子序列


131. 分割回文串

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

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

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 分割回文串* @create 2023-08-28 17:07*/
public class PartitionTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);String s=input.nextLine();System.out.println(partition(s));}public static List<List<String>> res=new ArrayList<>();public static List<String> path=new ArrayList<>();public static List<List<String>> partition(String s) {backtracking(s,0);return  res;}private static void backtracking(String s, int startIndex) {//终止条件if(startIndex>=s.length()){//收获结果res.add(new ArrayList<>(path));return;}for (int i = startIndex; i <s.length() ; i++) {//判断是否回文,如果是,则加入到path中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 static boolean isPalindrome(String s, int left, int right) {for (int i = left,j=right; i <j ; i++,j--) {if(s.charAt(i)!=s.charAt(j)){return false;}}return true;}
}

93. 复原 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 地址。

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

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 复原IP地址* @create 2023-08-28 21:21*/
public class RestoreIpAddressesTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);String s=input.nextLine();System.out.println(restoreIpAddresses(s));}public static List<String> res=new ArrayList<>();public static List<String> restoreIpAddresses(String s) {if(s.length()>12){ //剪枝return res;}//采用StringBuilder,不用重复重复重复创建字符串StringBuilder sb=new StringBuilder(s);backtracking(sb,0,0);return res;}private static void backtracking(StringBuilder sb, int startIndex, int pointCount) {//终止条件if(pointCount==3){// 判断第四段子字符串是否合法,如果合法就放进result中if(isValid(sb,startIndex,sb.length()-1)){res.add(sb.toString());}return;}for (int i = startIndex; i < sb.length(); i++) {//判断字段是否合法if(isValid(sb,startIndex,i)){//如果合法添加"." sb.insert()方法,该方法是在索引的前面添加字符串sb.insert(i+1,".");pointCount++;//将i+2的位置作为下一个字符串的起始位置,因为多添加了一个"."backtracking(sb,i+2,pointCount);//回溯sb.deleteCharAt(i+1);pointCount--;}else {break;}}}/*判断是否合法IP段:1.每个整数位于0到255之间组成2.段位以0为开头的数字不合法3.段位里有非正整数字符不合法*/private static boolean isValid(StringBuilder sb, int start, int end) {if(start>end){return false;}//3.段位里有非正整数字符不合法for (int i = start; i <=end ; i++) {if(sb.charAt(i)<'0'||sb.charAt(i)>'9'){return false;}}//1.每个整数位于0到255之间组成int num=Integer.parseInt(sb.substring(start,end+1));if(num<0||num>255){return false;}//2.段位以0为开头的数字不合法if(sb.charAt(start)=='0'&&start!=end){return false;}return true;}}

78. 子集

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

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

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 子集** (思路:如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,* 那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!** 其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。* @create 2023-08-29 10:25*/
public class SubsetsTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < n; i++) {nums[i]=input.nextInt();}System.out.println(subsets(nums));}public static List<List<Integer>> res=new ArrayList<>();public static List<Integer> path=new ArrayList<>();public static List<List<Integer>> subsets(int[] nums) {backtracking(nums,0);return res;}private static void backtracking(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]);backtracking(nums,i+1);//回溯path.remove(path.size()-1);}}
}

90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

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

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** @author light* @Description 子集II* @create 2023-08-29 11:03*/
public class SubsetsWithDupTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < n; i++) {nums[i]=input.nextInt();}System.out.println(subsetsWithDup(nums));}public static List<List<Integer>> res=new ArrayList<>();public static List<Integer> path=new ArrayList<>();public static List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);int[] used=new int[nums.length];Arrays.fill(used,0);backtracking(nums,0,used);return res;}private static void backtracking(int[] nums, int startIndex, int[] used) {res.add(new ArrayList<>(path));//终止条件if(startIndex>=nums.length){return;}for (int i = startIndex; i < nums.length; i++) {if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0){continue;}path.add(nums[i]);used[i]=1;backtracking(nums,i+1,used);//回溯path.remove(path.size()-1);used[i]=0;}}
}

491. 递增子序列

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
import java.util.*;/*** @author light* @Description 递增子序列* @create 2023-08-29 15:01*/
public class FindSubsequencesTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < n; i++) {nums[i]=input.nextInt();}System.out.println(findSubsequences(nums));}public static List<List<Integer>> res=new ArrayList<>();public static List<Integer> path=new ArrayList<>();public static List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums,0);return res;}private static void backtracking(int[] nums, int startIndex) {if(path.size()>1){res.add(new ArrayList<>(path));  //注意不要加return,要收集树上的所有节点}if(startIndex>=nums.length){return;}Set<Integer> set=new HashSet<>();//记录本层元素是否重复使用for (int i = startIndex; i < nums.length; i++) {//如果队列不为空,但要添加的元素小于path中的最后一个元素---不是递增的---不满足条件//或者集合中已经含有nums[i]---本层有重复元素----不满足条件if((!path.isEmpty()&&nums[i]<path.get(path.size()-1))||set.contains(nums[i])){continue;}set.add(nums[i]); //每层都创建一个---不需要回溯path.add(nums[i]);backtracking(nums,i+1);//回溯path.remove(path.size()-1);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59915.shtml

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

相关文章

基于非洲秃鹫算法优化的BP神经网络(预测应用) - 附代码

基于非洲秃鹫算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于非洲秃鹫算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.非洲秃鹫优化BP神经网络2.1 BP神经网络参数设置2.2 非洲秃鹫算法应用 4.测试结果&#xff1a;5…

实现带头双向循环链表

&#x1f308;带头双向循环链表 描述&#xff1a;一个节点内包含两个指针&#xff0c;一个指向上一个节点&#xff0c;另一个指向下一个节点。哨兵位指向的下一个节点为头节点&#xff0c;哨兵位的上一个指向尾节点。 结构优势&#xff1a;高效率找尾节点&#xff1b;高效率插入…

度矩阵、邻接矩阵

度矩阵&#xff08;degree matrix&#xff09; 度矩阵是对角阵&#xff0c;对角上的元素为各个顶点的度&#xff0c;顶点vi的度表示和该顶点相关联的变得数量。 在无向图中&#xff0c;顶点vi的度d(vi)N(i)&#xff08;即与顶点相连的边的数目&#xff09;有向图中&#xff0…

【力扣】55、跳跃游戏

var canJump function(nums){let cover 0;for(let i0;i<nums.length;i){if(i<cover){cover Math.max(nums[i]i,cover);if(cover >nums.length-1){return true;}}}}

stm32之DS18B20

DS18B20与stm32之间也是通过单总线进行数据的传输的。单总线协议在DHT11中已经介绍过。虽说这两者外设都是单总线&#xff0c;但时序电路却很不一样&#xff0c;DS18B20是更为麻烦一点的。 DS18B20 举例&#xff08;原码补码反码转换_原码反码补码转换_王小小鸭的博客-CSDN博客…

打开软件报错mfc100u.dll缺失是什么意思?简单式修复mfc100u.dll问题

首先&#xff0c;我们需要了解什么是MFC100U.dll文件以及它的作用。MFC100U.dll是一个Microsoft Foundation Class (MFC)库文件&#xff0c;它是Visual C应用程序开发的一部分。MFC库提供了许多通用的功能&#xff0c;如窗口管理、消息处理等&#xff0c;可以帮助开发者更快速地…

js的es6的特性

ES6特性 类 lass Person{constructor(name) {this.name 小明;}console() {console.log(this.name);} } const man new Man(小明); man.console(); // 小明 模块化 js代码 // 模块 变量 export let a 3; // 模块 方法 export function b(){console.log("hello"…

C++中前置++和后置++的详细讲解

参考链接&#xff08;链接讲的很全&#xff09;&#xff1a;C前置和后置的区别 对于迭代器和其他模板对象使用前缀形式 (i) 的自增, 自减运算符.&#xff0c;理由是 前置自增 (i) 通常要比后置自增 (i) 效率更高。 class Age { public: Age& operator() //前置 {…

fastjson-1.2.24-rce(CVE-2017-18349)fastjson-1.2.47-rce(CNVD-2019-22238)

一.fastjson 1.2.24 反序列化导致任意命令执行漏洞(CVE-2017-18349) fastjson在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。通过查找代码中相关的方法&#xff0c;即可构造出一些恶意利用链 影响范围…

Ansible学习笔记2

Ansible是Python开发的自动化运维工具&#xff0c;集合了众多运维工具&#xff08;Puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置&#xff0c;批量程序部署、批量运行命令等功能。 特点&#xff1a; 1&#xff09;部署简单&#xff…

基于金枪鱼群算法优化的BP神经网络(预测应用) - 附代码

基于金枪鱼群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于金枪鱼群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.金枪鱼群优化BP神经网络2.1 BP神经网络参数设置2.2 金枪鱼群算法应用 4.测试结果&#xff1a;5…

【Java基础增强】Stream流

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得…

Swift使用PythonKit调用Python

打开Xcode项目。然后选择“File→Add Packages”&#xff0c;然后输入软件包依赖链接&#xff1a; ​https://github.com/pvieito/PythonKit.git https://github.com/kewlbear/Python-iOS.git Python-iOS包允许在iOS应用程序中使用python模块。 用法&#xff1a; import Pyth…

leetcode-188-买卖股票的最佳时机 IV

1. 问题描述 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/ 2. 解题代码 public class Solution {public int MaxProfit(int k, int[] prices) {if(prices.Length<2){return 0;}if(k0){return 0;}List<int> listValuenew List<…

【项目 计网7】4.20 多进程实现并发服务器 4.22 多线程实现并发服务器

文章目录 4.20 多进程实现并发服务器server_process.cclient.c4.22 多线程实现并发服务器客户端代码&#xff1a;服务端代码&#xff1a; 4.20 多进程实现并发服务器 要实现TCP通信服务器处理并发的任务&#xff0c;使用多线程或者多进程来解决。 思路&#xff1a; 1、一个父进…

省级智慧农业大数据平台项目规划建设方案[195页Word]

导读:原文《省级智慧农业大数据平台项目规划建设方案[195页Word]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 1 农业大数据平台项目概述 1.1 建设背景 1.2 农业大数据带了的新的挑战 1.2.1 数据挖掘搜集复杂…

VBA:按照Excel工作表中的名称列自动汇总多个工作薄中对应sheet中所需要的数据

需求如下&#xff1a; B列为产品名为合并单元格&#xff0c;C列为供应商名&#xff0c;G、H列为金额数据&#xff1b;数据源放在同一个文件夹内&#xff0c;B列产品名来源于工作薄名称中间的字符串&#xff0c;C列供应商名来源于工作薄中的sheet名&#xff1b;G、H列金额数据来…

【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

字符串翻转合集 344. 反转字符串541. 反转字符串Ⅱ151. 反转字符串中的单词剑指 Offer 58 - II. 左旋转字符串反转单词思路循环挪动子串和子串的拼接 344. 反转字符串 题目链接&#xff1a;344. 反转字符串 题目内容&#xff1a; 题目中重点强调了必须原地修改输入数组&#…

2023_Spark_实验三:基于IDEA开发Scala例子

一、创建一个空项目&#xff0c;作为整个项目的基本框架 二、创建SparkStudy模块&#xff0c;用于学习基本的Spark基础 三、创建项目结构 1、在SparkStudy模块下的pom.xml文件中加入对应的依赖&#xff0c;并等待依赖包下载完毕。 在pom.xml文件中加入对应的依赖 ​<!-- S…

理论转换实践之keepalived+nginx实现HA

背景&#xff1a; keepalivednginx实现ha是网站和应用服务器常用的方法&#xff0c;之前项目中单独用nginx实现过负载均衡和服务转发&#xff0c;keepalived一直停留在理论节点&#xff0c;加之最近工作编写的一个技术文档用到keepalived&#xff0c;于是便有了下文。 服务组件…