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

复原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.hqwc.cn/news/479983.html

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

相关文章

MAC端Terminus 绿色版下载【一键安装,即可使用】

Termius Mac 是一款非常好用而且漂亮的SSH客户端&#xff0c;能快速远程控制服务器 现在呢&#xff0c;很多小伙伴&#xff0c;都开始使用这个软件啦 但是对于mac系统来说&#xff1a; 这个软件不要在苹果app store下载&#xff0c;不能实现传输功能这个软件目前有7天适用期&a…

MybatisPlus多表联查-分页关联查询+根据id获取多表联查后的单行数据

分页关联查询 需求分析 有两张表w以及d&#xff0c;需要w的一些字段以及d的一些字段在前端显示 此时就需要用到关联查询&#xff0c;查询到的数据放入视图类&#xff0c;显示在前端 项目结构 视图类 package com.wedu.modules.tain.entity.vo;import lombok.Data;import ja…

SpringBoot常见问题

1 引言 Spring Boot是一个基于Spring框架的快速开发脚手架&#xff0c;它简化了Spring应用的初始化和搭建过程&#xff0c;提供了众多便利的功能和特性&#xff0c;比如自动配置、嵌入式Tomcat等&#xff0c;让开发人员可以更加专注于业务逻辑的实现。   Spring Boot还提供了…

Linux:Jenkins:GitLab+Maven+Jenkins的部署(1)

1.环境 我这里准备了三台centos7 1.用于部署gitlab 运行内存&#xff1a;6G 名字&#xff1a;Jenkins-GitLab 192.168.6.1 2.用于部署jenkins 运行内存&#xff1a;2G 名字&#xff1a;Jenkins-server 192.168.6.2 3.用于打包测试…

你真的懂串口通信吗?

一、什么是串口通讯&#xff1f; 串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢&#xff0c;但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。 典型的串口通信使用3根线完成&#xff0c;分…

网络安全--网鼎杯2018漏洞复现(二次注入)

一、环境&#xff1a;在线测试平台 BUUCTF在线评测 (buuoj.cn) 二、进入界面先尝试万能账号 1or11# 换格式 hais1bux1 11or11# 三、万能的不行那我们就得想注册了&#xff0c;去register.php去看看 注册个账号 发现用户名回显&#xff0c;猜测考点为用户名处二次注入&…

《戴森球计划》好玩吗?《戴森球计划》怎么在苹果电脑上安装 戴森球计划攻略 Mac游戏推荐

《戴森球计划》是一款具有强大现实科学基础的模拟策略游戏&#xff0c;玩家的目标是构建能源效率极高的戴森球以解决能源问题。游戏的背景设定启发于科幻作品中的戴森球概念。游戏采用逼真的物理模拟&#xff0c;玩家需要合理规划资源&#xff0c;以应对复杂的能源危机。那么《…

Open3D三维重建

原始点云&#xff1a; alpha_shape算法 import open3d as o3dpcd o3d.io.read_point_cloud("airplane_0001.pcd") mesh o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha0.1) o3d.visualization.draw_geometries([mesh], mesh_show_b…

【贪心算法】代码随想录算法训练营第三十七天 |738.单调递增的数字,968.监控二叉树,总结(待补充)

738.单调递增的数字 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个非负整数 N&#xff0c;找出小于或等于 N 的最大的整数&#xff0c;同时这个整数需要…

微信小程序之会议OA个人中心后台交互

目录 获取用户昵称头像和昵称 小程序登录 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxProperties WxConfig WxAuthController 登录-小…

Sora:新一代实时音视频通信框架

一、Sora简介 Sora是一个开源的实时音视频通信框架&#xff0c;旨在提供高效、稳定、可扩展的音视频通信解决方案。它基于WebRTC技术&#xff0c;支持跨平台、跨浏览器的实时音视频通信&#xff0c;并且具备低延迟、高并发、易集成等特点。 --点击进入Sora(一定要科学哦&#x…

JVM原理

一、java虚拟机的生命周期&#xff1a; Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务&#xff1a;执行Java程序。程序开始执行时他才运行&#xff0c;程序结束时他就停止。你在同一台机器上运行三个程序&#xff0c;就会有三个运行中的Java虚拟机。 Java虚拟…