算法通关村-----继续看回溯问题

复原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 中的任何数字。你可以按任何顺序返回答案。详见leetcode93

问题分析

这是一道字符串分割问题,可以使用回溯方法来解决。
在分割问题中,回溯时,startIndex代表分割的开始位置下标,i代表分割的结束位置下标。当startIndex到达字符串的末尾位置时结束,根据有效的ip地址含义,创建工具方法判断ip地址是否有效,在递归之前判断可简化代码。当startIndex到达字符串的末尾位置,并且字符串分割为4部分时,可以进行结果收集。

代码实现

StringBuilder path = new StringBuilder();
List<String> res = new ArrayList<>();
int count = 0;public List<String> restoreIpAddresses(String s) {backtracking(s,0);return res;
}public void backtracking(String s, int startIndex){if(startIndex>=s.length() && count==4){path.deleteCharAt(path.length()-1);res.add(path.toString());return;}if(startIndex>=s.length() || count==4){return;}for(int i=startIndex;i<s.length()&&i-startIndex<3;i++){if(isValid(s,startIndex,i)){path.append(s.substring(startIndex,i+1)+".");count++;backtracking(s,i+1);count--;path.deleteCharAt(path.length()-1);int len = i+1-startIndex;// path.delete(path.length()-len,path.length());path.delete(startIndex + count, i + count + 2);}}
}public boolean isValid(String s,int start,int end){s = s.substring(start,end+1);if(s.length()!=1 && s.charAt(0)=='0'){return false;}long num = Long.parseLong(s);return num <=255L;
}

电话号码问题

问题描述

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

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

电话号码

问题分析

这是一道组合类型问题,可以使用回溯算法来解决。在解决组合问题时,使用startIndex代表所选元素的开始位置。选定数字后,需要依次选择数字对应的所有字母。数字和字母的对应关系可以使用数组或者map来存储。递归时选择下一个数字。因为每一个数字选择一个字母进行组合,所以当所选字母集合元素个数等于代表数字的字符串长度时,可以进行结果收集。

代码实现

List<String> res = new ArrayList<>();
StringBuilder path = new StringBuilder();
public List<String> letterCombinations(String digits) {if(digits==null || digits.length()==0){return res;}Map<Character,String> map = new HashMap<>();map.put('2',"abc");map.put('3',"def");map.put('4',"ghi");map.put('5',"jkl");map.put('6',"mno");map.put('7',"pqrs");map.put('8',"tuv");map.put('9',"wxyz");backingtracking(digits,map,0);return res;
}public void backingtracking(String digits,Map<Character,String> map,int startIndex){if(path.length()==digits.length()){res.add(path.toString());return;}for(int i=startIndex;i<digits.length();i++){String s = map.get(digits.charAt(i));for(int j=0;j<s.length();j++){path.append(s.charAt(j));backingtracking(digits,map,i+1);path.deleteCharAt(path.length()-1);}}
}

括号生成问题

问题描述

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

问题分析

可以使用两个变量left和right来代表左括号和右括号的数量。初始时,left=right=0,根据括号的有效性,left<n时可以进行递归,right<left时可以进行递归。当left+right=2*n时进行结果收集。使用Java语言,可以使用StringBuilder避免字符串拼接造成的内存浪费。

代码实现

List<String> res = new ArrayList<>();
StringBuilder sb = new StringBuilder();public List<String> generateParenthesis(int n) {backtracking(0,0,n);return res;
}public void backtracking(int left, int right, int n){if(sb.length()==2*n){res.add(sb.toString());return;}if(left<n){sb.append('(');backtracking(left+1,right,n);sb.deleteCharAt(sb.length()-1);}if(right<left){sb.append(')');backtracking(left,right+1,n);sb.deleteCharAt(sb.length()-1);}
}

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

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

相关文章

ElasticSearch之Index Template 和Dynamic Template

写在前面 在ElasticSearch之Mapping 一文中我们一起看了es的dynamic mapping机制&#xff0c;通过该机制允许我们不需要显式的定义mapping信息&#xff0c;而是es根据插入的文档值来自动生成 &#xff0c;比如插入如下的文档&#xff1a; {"firstName": "Chan…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十一章 基础界面开发 (组件封装和使用)

前言 Vue 是前端开发中非常常见的一种框架&#xff0c;它的易用性和灵活性使得它成为了很多开发者的首选。而在 Vue2 版本中&#xff0c;组件的开发也变得非常简单&#xff0c;但随着 Vue3 版本的发布&#xff0c;组件开发有了更多的特性和优化&#xff0c;为我们的业务开发带…

css pointer-events 多层鼠标点击事件

threejs 无法滑动视角&#xff0c;菜单界面覆盖threejs操作事件。 pointer-events /* Keyword values */ pointer-events: auto; pointer-events: none; pointer-events: visiblePainted; /* SVG only */ pointer-events: visibleFill; /* SVG only */ pointer-events: visib…

Python中HTTP请求的基本方法:穿越网络的魔法咒语

在网络世界中&#xff0c;HTTP请求就像是对服务器的“魔法咒语”&#xff0c;它能让我们的Python程序与远方的服务器进行沟通&#xff0c;获取或发送数据。今天&#xff0c;我们就来聊聊Python中HTTP请求的基本方法&#xff0c;看看这些“咒语”是如何施展的。 首先&#xff0…

力扣爆刷第74天--动态规划01背包

力扣爆刷第74天–动态规划 文章目录 力扣爆刷第74天--动态规划一、494.目标和二、474.一和零 一、494.目标和 题目链接&#xff1a;https://leetcode.cn/problems/target-sum/description/ 思路&#xff1a;求目标和的组合数&#xff0c;把物品里的元素分为左右两堆&#xff0…

java数据结构与算法刷题-----LeetCode155. 最小栈

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 1. 法一&#xff1a;使用辅助最小栈 解题思路&#xff1a;时间复杂度O(1)…

自己怎么做小程序?如何通过小程序赚钱?如何确保产品有竞争力?

引言 随着科技的迅速发展&#xff0c;小程序已经成为创业者们进军电商领域的一种重要途径。在这个数字时代&#xff0c;通过小程序卖东西已经成为一种便捷而高效的商业模式。本文将为您解析自己如何通过小程序销售商品&#xff0c;并实现盈利的关键步骤。无论您是初入创业圈的…

ClickHouse 基础(一)

官网 以毫秒为单位查询数十亿行 ClickHouse是用于实时应用和分析的最快、资源效率最高的开源数据库。 安装ClickHouse 使用ClickHouse&#xff0c;你有三个选择: ClickHouse云:官方ClickHouse作为一项服务&#xff0c;-由ClickHouse的创建者构建&#xff0c;维护和支持快速安…

【软件设计模式之适配器模式】

文章目录 前言一、适配器模式概述1.定义与目的2.使用场景系统升级与集成接口不一致问题的解决兼容旧版本API多种数据源处理 二、适配器模式的结构1.主要组件适配器&#xff08;Adapter&#xff09;目标接口&#xff08;Target Interface&#xff09;被适配者&#xff08;Adapte…

亚马逊广告:掌握基础知识以提升销量

如果你是一名卖家&#xff0c;希望通过亚马逊这个强大的电商平台扩大你的业务&#xff0c;那么了解亚马逊的广告系统就显得至关重要。有效地利用亚马逊广告服务不仅可以提高你的产品可见性&#xff0c;还可以增加销量&#xff0c;从而提升你的整体业绩。在本篇文章中&#xff0…

人机协同中的态势感知纠错

态势感知纠错在人机协同中是一种重要的技术手段&#xff0c;旨在提高机器感知和理解现实世界的能力&#xff0c;从而更好地支持人类的决策与行动。具体来说&#xff0c;态势感知纠错技术可以通过以下方式实现&#xff1a; 1、感知和理解 机器可以感知和理解环境中的各种信息&am…

Hadoop-Yarn-调度器总结

一、Yarn有哪些调度器 在cdh中Yarn组件中查看配置如下&#xff1a; 可以看到Yarn有三种调度器&#xff0c;分别是FairScheduler、FifoScheduler、CapacityScheduler&#xff0c;它们都是Hadoop的一个可插入调度器。 cdh默认的调度器是FairScheduler&#xff0c;hadoop默认的调…

神经网络权重初始化

诸神缄默不语-个人CSDN博文目录 &#xff08;如果只想看代码&#xff0c;请直接跳到“方法”一节&#xff0c;开头我介绍我的常用方法&#xff0c;后面介绍具体的各种方案&#xff09; 神经网络通过多层神经元相互连接构成&#xff0c;而这些连接的强度就是通过权重&#xff…

Linux-目录I/O-004

学习重点&#xff1a; 1.目录I/O的函数接口 2.目录的遍历&#xff0c;目录的递归遍历 1.【mkdir】 1.1函数原型 【int mkdir(const char *pathname, mode_t mode);】1.2函数功能 创建目录文件1.3函数参数 1.3.1【pathname】 文件路径1.3.2【mode】 文件的权限1.4返回值 …

【Java EE初阶二十】关于http(一)

1. 初识http HTTP 最新的版本应该是 HTTP/3.0&#xff0c;目前大规模使用的版本 HTTP/1.1&#xff1b; 下面来简单说明一下使用 HTTP 协议的场景: 1、浏览器打开网站 (基本上) 2、手机 APP 访问对应的服务器 (大概率) 前面的 TCP与UDP 和http不同&#xff0c;HTTP 的报文格式&a…

【conda环境 安装 tensorflow2.2】 解决方案

1.检查anaconda安装&#xff1a;在cmd输入 conda --version 2.检测已经安装的环境&#xff1a;conda info --envs 3.新建一个python3.5的环境&#xff0c;tensorflow&#xff1a; ###conda create -n xxx python3.5 xxx为虚拟环境名 ###conda create -n xxx python3.6 xxx为虚拟…

中科星图——影像卷积核函数Kernel之gaussian高斯核函数核算子、Laplacian4核算子和square核算子等的分析

简介 高斯核函数是图像处理中常用的一种卷积核函数。它是一种线性滤波器,可以实现图像的平滑处理。在图像处理中,高斯核函数的卷积操作可以用于去噪、平滑和模糊等任务。 高斯核函数的定义可以表示为一个二维高斯分布函数,表达式如下: G(x, y) = (1 / (2 * pi * sigma^2…

openGauss 5.0.0全密态数据库应用小试

前言 openGauss HCIA教材中&#xff0c;安全是一个重要的章节&#xff0c;在实际项目中&#xff0c;随着网络安全和信息安全形势的变化&#xff0c;企业也越来越重视数据库安全。去年在HALP内部进行openGauss培训时&#xff0c;安全特性就被学员们提出来要重点讲解&#xff0c…

【DC-DC】世微 AP2813 平均电流型双路降压恒流驱动器

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外 围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降 压 LED 恒流驱动芯片。内置功率管输出最大功率可达 12W&#xff0c;最大电流 1.2A。 AP2813 一路直亮&#xff0c;另外一路通过 MODE1 切换 全亮&#…

使用C++调用浏览器、邮箱等

ShellExecute的功能是运行一个外部程式&#xff08;或者是开启一个已注册的文件、开启一个目录、列印一个文件等等&#xff09;&#xff0c;并对外部程式有一定的控制。 函数原型&#xff1a; HINSTANCE ShellExecute( HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR …