回溯难题(算法村第十八关黄金挑战)

复原 IP 地址

93. 复原 IP 地址 - 力扣(LeetCode)

有效 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 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

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

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

提示:

  • 1 <= s.length <= 20
  • s 仅由数字组成

IP地址只有四段,所以将分割的段数 == 4作为终止条件。考虑到构造IP地址时还要手动给添加三个小数点,所以我们用变量pointCount来表示小数点数量,pointCount == 3说明字符串分成了4段了。

List<String> addressList = new ArrayList<>();public List<String> restoreIpAddresses(String s)
{if(s.length() < 4 || s.length() > 12)return addressList;backTracing(s, 0, 0);return addressList;
}//判断索引在[start,end]之间的字符能否构造有效的IP的地址
public boolean isValid(String s, int start, int end)
{//避免数组越界if (start > s.length() - 1)return false;//含有前导零if (s.charAt(start) == '0' && start != end)return false;//四位数及以上if (end - start >= 3)return false;int num = 0;for (int i = start; i <= end; i++)num = num * 10 + s.charAt(i) - '0';return num <= 255;
}/*** @param pointCount  . 的个数*/
public void backTracing(String s, int startIndex, int pointCount)
{//若已经分成四段if (pointCount == 3){//若最后一段有效,则记录一个有效IP地址if (isValid(s, startIndex, s.length() - 1))addressList.add(s);return;}//分段不足则继续分for (int i = startIndex; i < s.length(); i++){if (isValid(s, startIndex, i)){//用截取、拼接的方法插入 .s = s.substring(0, i + 1) + "." + s.substring(i + 1);pointCount++;//插入 . 后,字符串 s 中下一个数字的索引为 i + 2。//不用担心越界,因为 s 的长度也变大了backTracing(s, i + 2, pointCount);//撤回 .s = s.substring(0, i + 1) + s.substring(i + 2);pointCount--;}else //若中间有一段无效,那后面的都不用看了break;}
}

电话号码的字母组合

17. 电话号码的字母组合 - 力扣(LeetCode)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

img

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

图解思路

在这里插入图片描述

代码实现

List<String> combinationList = new ArrayList<>();
String digits;//数字到字母的映射
String[] map = {"", "", "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//更高效的字符串拼接类型
StringBuilder combination = new StringBuilder();public List<String> letterCombinations(String digits)
{if(digits.isEmpty())return combinationList;this.digits = digits;backTracing(0);return combinationList;
}/*** @param numIndex digits中数字 num 的索引*/
public void  backTracing(int numIndex)
{if (numIndex > digits.length() - 1){combinationList.add(combination.toString());return;}//求 num 所映射的字符串String str = map[digits.charAt(numIndex) - '0'];for (int i = 0; i < str.length(); i++){//从 str 中依次选取单个字符combination.append(str.charAt(i));//从 digits 中选择下一个数字backTracing(numIndex + 1);//撤销组合中最后一个字符,循环再试(换本层 str 的下一个字符)combination.deleteCharAt(combination.length() - 1);}
}

括号生成

22. 括号生成 - 力扣(LeetCode)

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

深搜,做减法

public List<String> generateParenthesis(int n)
{//特判if (n == 0)return null;//结果集ArrayList<String> res = new ArrayList<>();//深搜,找出全部有效括号组合DFS(res, n, n, "");return res;
}/*** @param res 结果集* @param left 左括号还能用几个* @param right 右括号还能用几个* @param curStr 当前递归所得到的字符串*/
public static void DFS(List<String> res, int left, int right, String curStr)
{//左右括号都用完了;将一种组合添加到结果集if (left == 0 && right == 0){res.add(curStr);return;}//若左括号剩余数量大于右括号剩余数量,则“剪枝”(不再进行这种错误模式的括号组合)。if (left > right)return;//若还剩余左括号,则使用左括号if (left > 0)DFS(res, left - 1, right, curStr + "(" );//若还剩余右括号,则使用右括号if (right > 0)DFS(res, left, right - 1, curStr +")" );
}

深搜,做加法

public List<String> generateParenthesis_2(int n)
{//特判if (n == 0)return null;//结果集ArrayList<String> res = new ArrayList<String>();//深搜,寻找全部有效括号组合DFS_2(res, 0, 0, "", n);return res;
}/*** @param res 结果集* @param left 左括号使用了几个* @param right 右括号使用使用了几个* @param curStr 当前递归所得到的字符串* @param n 题目所给的括号生成对数*/
public static void DFS_2(List<String> res, int left, int right, String curStr, int n)
{//递归终止;将一种组合添加到结果集if (left == n && right == n){res.add(curStr);return;}//若左括号使用数量小于右括号使用数量,则“剪枝”(不再进行这种错误模式的括号组合)if (left < right)return;//若还剩余左括号,则使用左括号if (left < n)DFS_2(res, left + 1, right, curStr + "(", n);//若还剩余右括号,则使用右括号if (right < n)DFS_2(res, left, right + 1, curStr +")", n);
}

广搜

class Node
{String curStr;int left;   //左括号还剩几个没用int right; //右括号还剩几个没用public Node(String curStr, int left, int right){this.curStr = curStr;this.left = left;this.right = right;}
}public List<String> generateParenthesis_3(int n)
{//特判,否则n==0时下面的算法会返回""if(n == 0)return null;//结果集ArrayList<String> res = new ArrayList<String>();ArrayDeque<Node> queue = new ArrayDeque<>();//初始结点入队queue.offer(new Node("", n, n));while (!queue.isEmpty()){//队头元素出队Node curNode = queue.poll();//生成了一组有效括号if(curNode.left == 0 && curNode.right == 0)res.add(curNode.curStr);//若还剩余左括号,则使用左括号if (curNode.left > 0)queue.offer(new Node(curNode.curStr + "(", curNode.left - 1, curNode.right));//若还剩余右括号,且左括号剩余数少于右括号剩余数,则使用右括号if (curNode.right > 0 && curNode.left < curNode.right)queue.offer(new Node(curNode.curStr + ")", curNode.left, curNode.right - 1));}return res;
}

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

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

相关文章

IDEA中使用git提交代码时,有.class文件怎么避免

在IDEA中使用git提交代码时&#xff0c;git把.class文件都给我放进来了&#xff0c;而我并不想要提交.class文件 我要提交的是.java文件 应该怎么设置呢 解决方案&#xff0c;点击整个项目的生命周期中的clean之前&#xff0c;你会发现git提交栏的.class文件都不见了。

ROS2服务通信的实现

文章目录 1.服务通信的概念及应用场景1.1概念1.2 应用场景 2.准备工作3.服务通信的实现3.1 服务通信接口消息3.2 服务端实现3.3 客户端实现3.4 编译及运行3.4.1 修改CMakeLists3.4.2 服务端运行结果3.4.2 客户端运行结果 1.服务通信的概念及应用场景 1.1概念 服务通信也是ROS…

抖店0元入驻不交钱会怎么样?个人店和个体店的利弊分析,开店必看

我是王路飞。 现在的抖店是可以开通个人店的。 也就是不需要营业执照、直接使用个人身份证就可以在抖音开店&#xff0c;而且也不需要缴纳店铺保证金就能开店运营了。 但真实情况是怎么样的呢&#xff1f;新手0元入驻抖店不交这个保证金会怎么样呢&#xff1f; 今天给想在抖…

AI大预言模型——ChatGPT在地学、GIS、气象、农业、生态、环境应用

原文链接&#xff1a;AI大预言模型——ChatGPT在地学、GIS、气象、农业、生态、环境应用 一开启大模型 1 开启大模型 1)大模型的发展历程与最新功能 2)大模型的强大功能与应用场景 3)国内外经典大模型&#xff08;ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diff…

ios App 发送广播失败解决

记录开发 ios App 使用 c 混编时遇到的问题&#xff1a; 开发环境 macOS Sonoma&#xff08;最新版本14.3.1&#xff09; Xcode Version 15.2 ipadOS&#xff08;最新版本17.3.1&#xff09; 问题&#xff1a;在mac 上 和 ipad上测试&#xff0c;当 udp 发送广播&#xff…

跨域引起的两个接口的session_id不是同一个

来源场景&#xff1a; RequestMapping(“/captcha”)接口设置了SESSION_KEY&#xff0c;也能获取到&#xff0c;但是到了PostMapping(“/login”)接口就是空的&#xff0c;由于跨域导致的两个session_id不是同一个 /*** 系统用户 前端控制器*/ Controller CrossOrigin(origins…

【数据结构和算法初阶(C语言)】双向循环带头链表的增删查改详解(天才设计的链表结构,应用简单逆天!!!!!)

目录 ​编辑​编辑 1.双向链表的定义&#xff1a;前赴后继 2.带头链表的定义-----哨兵位 3.增删查改 3.1创建新节点函数----方便后续增加节点调用 3.2创建哨兵位----创建头结点 3.3增加节点&#xff0c;尾部插入数据 3.4尾删除 3.5查找函数----遍历对比&#xff…

AcWing 562.壁画

咱先看一眼算法标签&#xff0c;发现是思维题、枚举、前缀和 Buttt其实我们根据上诉的样例解释部分就会发现&#xff0c;其实这就是一个长度为⌈n/2⌉&#xff08;向上取整哦&#xff09;的连续子数组的最大和。 这题我也用暴力法试过啦&#xff0c;很明显会TLE 如果你对dp题…

Mac M系列芯片如何重新安装系统

使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff0c;过程确保连接上网络&#xff0c;虽然这种方式不会下载 Mac OS&#xff0c;但是需要下载固件等信息&#xff09; 插入制作好的可引导安装器&#x…

【使用imgaug库调整图像大小并修改对应的XML标签框】

使用imgaug库可以方便地进行图像增强操作&#xff0c;包括调整图像大小。以下是使用imgaug库调整图像大小并修改对应的XML标签框的示例脚本&#xff1a; 注意修改输入文件夹路径、输出文件夹路径和目标尺寸为自己内容。 input_folder "path/to/your/input_folder" …

kalibr标定ZED2i双目加imu

一、录制bag 本人使用的zed2i相机。 rosbag record -O 32 /zed2i/zed_node/imu/data /zed2i/zed_node/imdata_raw /zed2i/zed_node/left/image_rect_color /zed2i/zed_node/right/image_rect_color /zed2i/zed_node/left_raw/image_raw_color /zed2i/zed_node/right_raw/ima…

Matlab|【免费】基于合作博弈的综合能源系统利益分配优化调度

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序实现的模型为综合能源系统利益分配优化调度&#xff0c;采用合作博弈方法&#xff0c;模型针对IES系统的P2G、电解槽、甲烷反应器、储氢罐、CHP和燃气锅炉等设备进行建模&#xff0c;实现基于合作博弈的…

Linux 学习笔记(10)

十、 进程管理 进程就是运行中的程序&#xff0c;一个运行着的程序&#xff0c;可能有多个进程。 比如 LinuxSir.Org 所用的 WWW 服务器是 apache 服务器&#xff0c;当管理员启动服务后&#xff0c;可能会有好多人来访问&#xff0c;也就是说许多用户来同时请 求 htt…

Django官网项目 二

官网地址&#xff1a;Writing your first Django app, part 2 | Django documentation | Django 创建模组&#xff1a; 注册model &#xff08;bug&#xff1a;没有加后面的逗号&#xff09; 在manage.py 的目录下&#xff1a; python manage.py makemigrations polls pyth…

redis09 集群(cluster)

思维草图 为什么要使用集群 单台redis内存容量的限制单台redis并发写量太大有性能瓶颈 redis集群认识 redis集群是对redis的水平扩容&#xff0c;即启动N个redis节点&#xff0c;将整个数据分布存储在这个N个节点中&#xff0c;每个节点存储总数据的1/N。 如下图&#xff1…

C++ 根据公式计算椭圆任意点到中心的距离

#include <iostream> using namespace std;double fact(int x) //定义阶乘函数。注意是double类型 {double y x; //注意是double类型for (int i x-1; i > 0; i--)y * i;return y; };double My_sin(int x) //定义sin函数。注意是double类型 {double y 0; //注意是do…

【视频图像取证篇】Amped FIVE专业法医图像和视频增强软件之模糊图像去隔行功能

【视频图像取证篇】Amped FIVE专业法医图像和视频增强软件之模糊图像去隔行功能 法医图像和视频增强软件&#xff0c;专业又强大&#xff01;&#xff01;&#xff01;超过 140 种过滤器和工具&#xff0c;用于分析、恢复和增强数字图像和视频。Amped FIVE能够稳定抖动的视频&…

Linux:ansible-playbook配置文件(剧本)(进阶)

Linux&#xff1a;ansible-playbook配置文件&#xff08;剧本&#xff09;_ansible-playbook -i参数-CSDN博客https://blog.csdn.net/w14768855/article/details/132579492?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170930036016800215061982%2522%252C%2522s…

LaTeX排版论文的常见问题汇总(持续更新中)

文章目录 LaTeX排版论文的常见问题汇总&#xff08;持续更新中&#xff09;1.如何上传期刊或会议提供的LaTeX模板&#xff1f;2.模板中各文件的说明3.LaTeX中如何设置字体大小&#xff1f;3.1如何设置表格中的字体大小&#xff1f;3.2如何设置表格、图片标题的字体大小&#xf…

A/D转换

硬件电路模型 模数转换代码 main.c #include <REGX52.H> #include "LCD1602.h" #include "Delay.h" #include "XPT2046.h"unsigned int ADValue; int main(){LCD_Init();LCD_ShowString(1,1,"ADJ NTC RG");while(1){ADValue …