算法通关村第18关【黄金】| 继续回溯

news2025/1/17 15:28:47

1.复原IP地址

思路:

单层for循环start控制开始位置,逐个遍历情况取,附带剪枝,递归返回后进行point回溯

深度递归pointNum三层,确定终止条件

class Solution {
    List<String> result = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        if(s.length()>12){
            return result;
        }
        trace(s,0,0);
        return result;
    }
    
    public void trace(String s,int start,int pointNum){
        if(pointNum == 3){
            if (isValid(s,start,s.length()-1)) {
                result.add(s);
            }
            return;
        }
        for(int i = start;i<s.length();i++){
            if(isValid(s,start,i)){
                pointNum++;
                s = s.substring(0,i+1) + "." + s.substring(i+1);
                trace(s,i+2,pointNum);
                pointNum--;// 回溯
                s = s.substring(0, i + 1) + s.substring(i + 2);// 回溯删掉逗点
            }else{
                break;
            }
        }


    }

    private Boolean isValid(String s, int start, int end) {
        if (start > end) {
            return false;
        }
        if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法
            return false;
        }
        int num = 0;
        for (int i = start; i <= end; i++) {
            if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮数字字符不合法
                return false;
            }
            num = num * 10 + (s.charAt(i) - '0');
            if (num > 255) { // 如果⼤于255了不合法
                return false;
            }
        }
        return true;
    }
}

2.电话号码的字母组合

思路:回溯模板

层的选择元素为c[num],for(int i = 0;i<c[num-2].length;i++),组合不需要剪枝

深度为digits的长度,确定终止条件

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList<String>();
        if(digits.length() == 0){
            return list;
        }
        char[][] c = {
            {'a','b','c'},
            {'d','e','f'},
            {'g','h','i'},
            {'j','k','l'},
            {'m','n','o'},
            {'p','q','r','s'},
            {'t','u','v'},
            {'w','x','y','z'}
        };
        int len = digits.length();
        char[] s = new char[len];
        trace(c,s,list,0,digits);
        return list;

    }
    public void trace(char[][] c,char[] s,List list,int cur,String digits){
        if(cur == s.length){
            list.add(new String(s));
            return;
        }
        int num = digits.charAt(cur) - '0';
        for(int i = 0;i<c[num-2].length;i++){
            num = digits.charAt(cur) - '0';
            s[cur] = c[num-2][i];
            trace(c,s,list,cur+1,digits);

        }
    }
}

3.括号生成

思路:回溯

层的选择元素有两个 '(' ,')',但是不能瞎选需要满足题目要求也就是要进行剪枝

  • 剩余左括号数量要小于等于右括号数量
  • 剩余的括号数量要大于0

由深度也就是n*2总共长度,确定终止条件

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> list = new ArrayList<>();
        char[] s = new char[n*2];
        trace(n,n,s,list,0);
        return list;
    }

    public void trace(int left,int rigth,char[] s,List list,int cur){
        if(left == 0 && rigth == 0){
            list.add(new String(s));
            return;
        }
        if(left-1>=0&&left-1<=rigth){
            s[cur] = '(';
            trace(left-1,rigth,s,list,cur+1);
        }
        if(rigth-1>=0&&left<=rigth-1){
            s[cur] = ')';
            trace(left,rigth-1,s,list,cur+1);
        }
    }
}

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

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

相关文章

如何查看前端项目vue版本

&#xff08;1&#xff09;点击package.json文件 &#xff08;2&#xff09;找到dependencies下面的value &#xff08;2&#xff09;查看vue版本 2开头为vue2 3开头为vue3

与 Harbor 构建高效的镜像加速工作流

镜像是容器的基础&#xff0c;如今有很多用户在实践使用 Harbor 作为镜像存储与分发方案&#xff0c;本文介绍了 Harbor 在支持镜像加速方面的能力&#xff0c;以及 Nydus 这种改进的镜像格式&#xff0c;用于解决镜像在网络&#xff0c;存储&#xff0c;端到端可信方面的问题。…

从外网 log4j2 RCE 再到内网组合拳漏洞 CVE-2021-42287、CVE-2021-42278 拿到 DC

网络拓扑 信息搜集 渗透测试第一步当然是信息搜集 拿到 IP192.168.81.151我们先使用nmap对他进行常规TCP端口的扫描 nmap -v -Pn -T3 -sV -n -sT --open -p 22,1222,2222,22345,23,21,445,135,139,5985,2121,3389,13389,6379,4505,1433,3306,5000,5236,5900,5432,1521,1099,5…

银河麒麟服务器x86安装qemu虚拟机,并安装windows server 2019

安装虚拟机 桌面右键&#xff0c;选择在终端中打开 输入下面的脚本 yum install -y virt-viewer virt-v2v libvirt* qemu* virt-manager 等待安装完成 安装成功 打开虚拟机软件 新建虚拟操作系统&#xff0c;以windows server 2019为例 选择镜像 点击前进 点击&#xff1a;是…

C语言实现编一程序显示由符号组成的三角形图案,行数与图形均可自行输入改变

* *** ***** ******* 完整代码&#xff1a; /*编一程序显示由符号组成的三角形图案&#xff0c;行数与图形均可自行输入改变。********* ******* */ #include<stdio.h>int main(){//n表示图案的行数int n;printf("请输入图案的行数:");scanf("%d"…

【数字图像处理笔记】01-数字图像基础

01-数字图像基础 图像类型 黑白(二值)图像 只有黑白两种颜色的图像称为黑白图像或单色图像&#xff0c;图像的每个像素只能是黑或白&#xff0c;没有中间的过渡&#xff0c;故又称为二值图像。 二值图像的像素值只能为0或1&#xff0c;图像中的每个像素值用1位存储。图像矩阵中…

新版外国人永居证身份证读卡器C++开发SDK接口

近期&#xff0c;国家移民管理局对外国人永久居留身份证&#xff08;以下简称永居证&#xff09;进行了升级改造和便利化应用工作&#xff0c;新版永居证将于 2023年 12 月 1 日起正式签发。新版永居证调整了号码规则&#xff0c;改进了信 息储存&#xff0c;优化了图案设计&am…

C++标准模板(STL)- 类型支持 (数值极限,epsilon,round_error,infinity)

数值极限 提供查询所有基础数值类型的性质的接口 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits<int>::m…

Android查看签名信息系列 · 使用Android Studio获取签名

前言 Android查看签名信息系列 之使用Android Studio获取签名&#xff0c;通过Android Studio自带的gradle来获取签名信息。 优点&#xff1a;此法可查看 MD5、SHA1 等信息。 缺点&#xff1a;升级某个Studio版本后&#xff0c;没有签名任务了&#xff0c;特别不方便。 实现…

简单的对称加密

异或 异或算法的好处便是数A和数B异或后&#xff0c;把结果再和数A异或便可得到B&#xff0c;或者和数B异或可重新得到数据A。利用异或的这个特性可简单实现数据的加密和解密算法。 恺撒密码 恺撒密码的替换方法是通过排列明文和密文字母表&#xff0c;密文字母表示通过将明…

【C++11】智能指针的使用以及模拟实现(shared_ptr,unique_ptr,auto_ptr,weak_ptr)

&#x1f30f;博客主页&#xff1a; 主页 &#x1f516;系列专栏&#xff1a; C ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ &#x1f60d;期待与大家一起进步&#xff01; 文章目录 一、 RAII概念一、auto_ptr1.基本使用2.模拟实现 二、unique_ptr1.基本使用2.模拟实现…

如何禁止在堆上和栈上创建对象

背景 首先需要知道的是&#xff1a; 在栈新建一个对象&#xff0c;不需要调用operator new&#xff0c;创建栈对象时会移动栈顶指针以“挪出”适当大小的空间&#xff0c;然后在这个空间上直接调用对应的构造函数以形成一个栈对象。当对象在栈上创建时&#xff0c;虽然编译器…

Apache Dubbo的主要项目模块

Apache Dubbo的项目结构或者主要项目模块如下所示&#xff1a;

Web架构安全分析/http/URL/Cookie攻击

Web 架构安全分析 Web 工作机制及基本概念 传统 Web 架构 LAMP 网页 概念 网页就是我们可以通过浏览器上网看到的精美页面&#xff0c;一般都是经过浏览器渲染过的 .html 页面&#xff0c;html 语言在浏览器中渲染。其中包含了CSS、JavaScript 等前端技术。通过浏览器访问…

excel 日期与时间戳的相互转换

1、日期转时间戳&#xff1a;B1INT((A1-70*365-19)*86400-8*3600)*1000 2、时间戳转日期&#xff1a;A1TEXT((B1/10008*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss") 以上为精确到毫秒&#xff0c;只精确到秒不需要乘或除1000。 使用以上方法可以进行excel中日期…

07AC91 GJR5252300R0101 什么是机器人技术

07AC91 GJR5252300R0101 什么是机器人技术 什么是机器人技术&#xff1f; 机器人学是工程学的一个分支&#xff0c;研究机器人的概念、设计、构造、操作、应用和使用。再深入一点&#xff0c;我们看到机器人被定义为自动操作的机器&#xff0c;它独立地执行一系列动作&#x…

[计算机提升] 系统及用户操作

1.4 系统及用户操作 1.4.1 系统操作 1.4.1.1 开机、关机、重启 在Windows系统中&#xff0c;开机&#xff08;Power On&#xff09;&#xff0c;关机&#xff08;Shutdown&#xff09;和重启&#xff08;Restart&#xff09;是指计算机的不同电源控制操作。 开机&#xff1a;…

官媒代运营:2023年企业如何建立一个成功的品牌?

在这个数字化急速发展的时代&#xff0c;企业的成功已不再只依赖于产品质量、资本实力和市场声誉&#xff0c;还在于如何经营营销&#xff0c;以确保品牌能在竞争激烈的市场中脱颖而出。随着时间的推移&#xff0c;营销策略也在不断演变&#xff0c;因此&#xff0c;紧跟潮流变…

dvaJs在react 项目中的简单使用

官网&#xff1a;入门课 | DvaJS 备注&#xff1a;个人学习 代码示例&#xff1a; getColumns.js const getColumns [{title: 姓名, // 列标题dataIndex: name, // 数据字段名称&#xff0c;与数据中的字段名对应key: name, // 列的唯一键},{title: 年龄, // 列标题dataIn…

Ps:变形

Ps菜单&#xff1a;编辑/变换/变形 Edit/Transform/Warp 变形 Warp是自由变换的一种模式&#xff0c;不仅可以用于物体的伸缩扭曲&#xff0c;也可用于人体的局部塑形。 除了从菜单打开&#xff0c;通常情况下&#xff0c;按 Ctrl T 进入自由变换&#xff0c;然后在画面上右击…