代码随想录 DAY28 93.复原IP地址 78.子集 90.子集II

news/2024/10/23 9:40:23/

93.复原IP地址 

切割字符串,并且在每一个切割过的字符串后面加上 ‘ .’

返回条件:逗点个数==3

        如果最后一小节符合要求,就将该字符串添加到结果集中

循环中:从start到i 符合要求,就继续添加逗点和字符

        不符合下面就不用看了。

不要试图一下找完,从第一个开始算。

class Solution {
private:
vector <string> result;void transfer(string&s,int start,int pointnum){if(pointnum==3){if(isVaild(s,start,s.size()-1)){result.push_back(s);}return;}for(int i=start;i<s.size();i++){if(isVaild(s,start,i)){s.insert(s.begin() + i + 1,'.');pointnum++;transfer(s,i+2,pointnum);pointnum--;s.erase(s.begin()+i+1);}else{break;}}}bool isVaild(const string& s, int start, int end) {if (start > end) {return false;}if (s[start] == '0' && start != end) { // 0开头的数字不合法return false;}int num = 0;for (int i = start; i <= end; i++) {if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法return false;}num = num * 10 + (s[i] - '0');if (num > 255) { // 如果大于255了不合法return false;}}return true;}public:vector<string> restoreIpAddresses(string s) {result.clear();if(s.size()<4||s.size()>12) return result;transfer(s,0,0);return result;}
};

78.子集 

结束条件+回溯过程

class Solution {
private:
vector<vector<int>> result;
vector<int> partset;void transfer(vector<int>& nums,int start){result.push_back(partset);if(start>=nums.size()){return;}for(int i=start;i<nums.size();i++){partset.push_back(nums[i]);transfer(nums,i+1);partset.pop_back();}
}public:vector<vector<int>> subsets(vector<int>& nums) {result.clear();partset.clear();transfer(nums,0);return result;}
};

90.子集II  

只是判断生成的子集是否重复

子集重复就是数字重复,和上一级递归的数字比较是否使用过

class Solution {
private:
vector<vector<int>> result;
vector<int> partset;void transfer(vector<int>& nums,int start,vector<bool> used){result.push_back(partset);for(int i=start;i<nums.size();i++){//数字重复             上一个已经使用过if(i>start&&nums[i]==nums[i-1]&&used[i-1]==false){continue;}used[i]==true;partset.push_back(nums[i]);transfer(nums,i+1,used);used[i]=false;partset.pop_back();}
}
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {result.clear();partset.clear();sort(nums.begin(),nums.end());vector<bool> used(nums.size(),false);transfer(nums,0,used);return result;}
};


http://www.ppmy.cn/news/977827.html

相关文章

Hive调优集锦(2)

3.8 Join 优化 Join优化整体原则&#xff1a; 1、优先过滤后再进行 join 操作&#xff0c;最大限度的减少参与 join 的数据量 2、小表 join 大表&#xff0c;最好启动 mapjoin&#xff0c;hive 自动启用 mapjoin, 小表不能超过25M&#xff0c;可以更改 3、Join on的条件相同的…

blender 基础材质篇

材质展示 材质背景介绍 什么是PBR&#xff1f; PBR 全称为 Physically Based Rendering&#xff0c;译为基于物理属性的引擎渲染&#xff0c;也就是说会把物质的颜色、粗糙度、高光属性等进行分别处理&#xff0c;使物质体现出更真实的感觉&#xff1b; 什么是BRDF&#xff…

网络安全合规与标准的主要发展方向

网络安全合规就是避免违反网络安全有关的法律、法规、规章、合同义务以及任何安全要求&#xff0c;标准在网络安全合规工作中扮演着重要的角色。 一、标准在网络安全合规体系中的地位作用 网络安全合规体系包括网络安全有关的法律、法规、规章、其他规范性文件、及合同义务等…

TM4C123系列(四)————UART串口通信

一.实验简介 使用TM4C123的串口通信功能实现单片机与PC端通信。 二.UART介绍 TM4C123有八个串口&#xff0c;其中UART0已经与USB集成&#xff0c;UART0建议只用来和PC端通信&#xff0c;不要与外界通信。 除此之外&#xff0c;与STM32不同&#xff0c;TM4的每个串口还都有两…

【C++STL标准库】关联容器

关联容器&#xff08;双向迭代器&#xff09; 这里给出set的基本使用方法&#xff1a; #include <iostream> #include <set>template <typename T> void print(T Begin, T End);int main() { std::set<int> obj { 0,2,1,4,6,3 }; //集合迭代器,反向…

前端生成批量二维码,并且下载到本地

Ⅰ- 壹 - 功能展示和使用需求 需求描述 前端生成批量二维码&#xff0c;并且下载&#xff0c;本项目使用了 vue3. 功能展示 Ⅱ - 贰 - 封装代码 需要的库 yanr add qrcodejs2-fix // 生成二维码 yarn add html2canvas // 转图片 yarn add jszip// 压缩包 yarn add file-sa…

VMWare虚拟机常用操作命令

今日一语&#xff1a;做到所有的细节都不放过&#xff0c;则可以避免99%已知的风险&#xff0c;但大多数都因懒惰而甘愿承受风险&#xff0c;至此悔不当初 查看虚拟机在本机网络的IP ip addr 本地向虚拟机传送文件 scp 文件 rootpath 虚拟机路径 enter后输入密码即可传输&am…

前端(node.js)调用dll动态链接库

Ⅰ- 壹 - 需求 使用 js node 调用dll 动态链接库. github地址如下&#xff0c;包含dll&#xff0c;里面就一个Add方法暴露出来 github Ⅱ - 贰 - 两种方式调用dll 当前开发环境 Windows 11 22H2 node v16.20.0 Python 3.11.2 一 node直接调用 需要安装这俩库 ffi-napi n…