当前位置: 首页 > news >正文

Rust每日一练(Leetday0026) 最小覆盖子串、组合、子集

 

目录

76. 最小覆盖子串 Minimum Window Substring  🌟🌟🌟

77. 组合 Combinations  🌟🌟

78. 子集 Subsets  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


76. 最小覆盖子串 Minimum Window Substring

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"

示例 2:

输入:s = "a", t = "a"
输出:"a"

示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

  • 1 <= s.length, t.length <= 10^5
  • s 和 t 由英文字母组成

进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?

 代码1: 滑动窗口

use std::collections::HashMap;fn min_window(s: String, t: String) -> String {let s: Vec<u8> = s.into_bytes();let t: Vec<u8> = t.into_bytes();if s.len() < t.len() {return String::new();}let mut need: HashMap<u8, i32> = HashMap::new(); // 存储t中每个字符的出现次数for i in 0..t.len() {*need.entry(t[i]).or_insert(0) += 1;}let (mut left, mut right) = (0, 0); // 滑动窗口的左右指针let mut count = t.len(); // 记录滑动窗口中还需要的字符数let mut min_len = s.len() + 1; // 记录最小覆盖子串的长度let mut start = 0; // 记录最小覆盖子串的起始位置while right < s.len() {// 当右指针指向的字符是需要的字符,count减一if let Some(v) = need.get_mut(&s[right]) {if *v > 0 {count -= 1;}*v -= 1;}right += 1;// 当count为0时,说明滑动窗口中已经包含t中的所有字符while count == 0 {// 如果当前的覆盖子串更小,则更新最小覆盖子串的长度和起始位置if right - left < min_len {min_len = right - left;start = left;}// 当左指针指向的字符是需要的字符,count加一if let Some(v) = need.get_mut(&s[left]) {*v += 1;if *v > 0 {count += 1;}}left += 1;}}if min_len == s.len() + 1 {"".to_string()} else {String::from_utf8_lossy(&s[start..start + min_len]).to_string()}
}fn main() {println!("{}", min_window("ADOBECODEBANC".to_string(), "ABC".to_string()));println!("{}", min_window("a".to_string(), "a".to_string()));println!("{}", min_window("a".to_string(), "aa".to_string()));
}

代码2: 双指针

use std::collections::HashMap;fn min_window(s: String, t: String) -> String {let mut need: HashMap<char, i32> = HashMap::new();let mut count = t.len() as i32;let (mut left, mut right, mut start, mut min_len) = (0, 0, 0, s.len() + 1);for c in t.chars() {*need.entry(c).or_insert(0) += 1;}let s = s.chars().collect::<Vec<_>>();while right < s.len() {if let Some(v) = need.get_mut(&s[right]) {if *v > 0 {count -= 1;}*v -= 1;}right += 1;while count == 0 {if right - left < min_len {min_len = right - left;start = left;}if let Some(v) = need.get_mut(&s[left]) {*v += 1;if *v > 0 {count += 1;}}left += 1;}}if min_len == s.len() + 1 {"".to_owned() // 返回空字符串} else {s[start..start + min_len].iter().collect()}
}fn main() {println!("{}", min_window("ADOBECODEBANC".to_string(), "ABC".to_string()));println!("{}", min_window("a".to_string(), "a".to_string()));println!("{}", min_window("a".to_string(), "aa".to_string()));
}

输出:

BANC
a
//空行


77. 组合 Combinations

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n

代码1: 回溯法

fn combine(n: i32, k: i32) -> Vec<Vec<i32>> {let mut res: Vec<Vec<i32>> = vec![]; // 存储所有组合let mut path: Vec<i32> = vec![]; // 存储当前组合fn backtrack(start: i32, n: i32, k: i32, path: &mut Vec<i32>, res: &mut Vec<Vec<i32>>) {if path.len() == k as usize { // 当前组合长度为k,加入结果中res.push(path.clone());return;}for i in start..=n { // 枚举可选数字path.push(i); // 加入当前数字backtrack(i + 1, n, k, path, res); // 从i+1开始枚举下一个数字path.pop(); // 撤销当前数字}}backtrack(1, n, k, &mut path, &mut res); // 从1开始枚举第一个数字res
}fn main() {println!("{:?}", combine(4, 2));println!("{:?}", combine(1, 1));
}

输出:

[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
[[1]]

代码2: 枚举法

fn combine(n: i32, k: i32) -> Vec<Vec<i32>> {let mut res: Vec<Vec<i32>> = vec![]; // 存储所有组合for i in 0..1<<n { // 枚举所有二进制数let mut path: Vec<i32> = vec![]; // 存储当前组合for j in 1..=n { // 枚举n个数字if i & 1 << j-1 != 0 { // 当前数字被选中path.push(j);}}if path.len() == k as usize { // 当前组合长度为k,加入结果中res.push(path);}}res
}fn main() {println!("{:?}", combine(4, 2));println!("{:?}", combine(1, 1));
}

78. 子集 Subsets

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

代码1:回溯法

fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {let mut res: Vec<Vec<i32>> = vec![]; // 存储所有子集fn back_track (index: usize, path: &mut Vec<i32>, nums: &[i32], res: &mut Vec<Vec<i32>>) { // 递归枚举所有子集let tmp: Vec<i32> = path.to_vec(); // 将当前组合复制到临时数组中let n = nums.len();res.push(tmp); // 加入当前子集for i in index..n { // 枚举每个数字path.push(nums[i]); // 加入数字构成新的组合back_track (i+1, path, nums, res); // 递归枚举下一位数字path.pop(); // 移除数字}}back_track (0, &mut vec![], &nums, &mut res); // 从空集开始递归枚举所有子集res
}fn main() {let nums: Vec<i32> = vec![1, 2, 3];println!("{:?}", subsets(nums));let nums: Vec<i32> = vec![0];println!("{:?}", subsets(nums));
}

输出:

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
[[], [0]]

代码2: 循环枚举

fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {let mut res: Vec<Vec<i32>> = vec![vec![]]; // 初始为空集for i in 0..nums.len() { // 枚举每个数字for sub in res.clone() { // 枚举已有的子集let mut temp = sub.clone();temp.push(nums[i]); // 加入当前数字res.push(temp); // 加入新的子集}}res
}fn main() {let nums: Vec<i32> = vec![1, 2, 3];println!("{:?}", subsets(nums));let nums: Vec<i32> = vec![0];println!("{:?}", subsets(nums));
}

输出:

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
[[], [0]]

代码3: 位运算

fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {let mut res: Vec<Vec<i32>> = vec![]; // 存储所有子集let n = nums.len();for i in 0..(1 << n) { // 枚举所有二进制数let mut path: Vec<i32> = vec![]; // 存储当前子集for j in 0..n { // 枚举n个数字if i & (1 << j) != 0 { // 当前数字被选中path.push(nums[j]);}}res.push(path); // 加入当前子集}res
}fn main() {let nums: Vec<i32> = vec![1, 2, 3];println!("{:?}", subsets(nums));let nums: Vec<i32> = vec![0];println!("{:?}", subsets(nums));
}

输出:

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
[[], [0]]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

相关文章:

Rust每日一练(Leetday0026) 最小覆盖子串、组合、子集

目录 76. 最小覆盖子串 Minimum Window Substring &#x1f31f;&#x1f31f;&#x1f31f; 77. 组合 Combinations &#x1f31f;&#x1f31f; 78. 子集 Subsets &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Gola…...

c# 从零到精通-ArrayList-Hashtable的操作

c# 从零到精通-ArrayList-Hashtable的操作 1、ArrayList的操作 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Test11 { class Program { static void Main(string[] args) { ArrayList list …...

pnpm带来了什么

首先 pnpm 和 npm yarn 一样是包管理工具&#xff0c;他解决了npm 和 yarn 存在的一些问题 npm3之前每个依赖都是一层嵌套一层的&#xff0c;每个依赖里都有node_modules 用来存放依赖所需的依赖包导致重复下载的依赖包很多&#xff0c;一层层嵌套&#xff0c;嵌套很深&#x…...

图像分类模型嵌入flask中开发PythonWeb项目

图像分类模型嵌入flask中开发PythonWeb项目 图像分类是一种常见的计算机视觉任务&#xff0c;它的目的是将输入的图像分配到预定义的类别中&#xff0c;如猫、狗、花等。图像分类模型是一种基于深度学习的模型&#xff0c;它可以利用大量的图像数据来学习图像的特征和类别之间…...

GIT安装教程(入门)

目录 前言 Git作者 官网 GIT优点 GIT缺点 为什么要使用 Git 下载以及安装步骤 一、官网下载 二、GIT安装步骤 1、安装get程序 2、许可声明 3、选择安装路径 4、选择git组件 5、创建菜单名称 6、 git文件默认编辑器 7、设置新存储库中初始分支的名称 8、调整Pa…...

全志V3S嵌入式驱动开发(触摸屏驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所谓的触摸屏&#xff0c;其实就是在普通的lcd屏幕之上&#xff0c;再加一层屏而已。这个屏是透明的&#xff0c;这样客户就可以看到下面lcd屏幕的…...

死信队列详解

什么是死信队列&#xff1f; 在消息队列中&#xff0c;执行异步任务时&#xff0c;通常是将消息生产者发布的消息存储在队列中&#xff0c;由消费者从队列中获取并处理这些消息。但是&#xff0c;在某些情况下&#xff0c;消息可能无法正常地被处理和消耗&#xff0c;例如&…...

我用ChatGPT写2023高考语文作文(五):北京卷I

2023年 北京卷 I 适用地区&#xff1a;北京 “续航”一词&#xff0c;原指连续航行&#xff0c;今天在使用中被赋予了新的含义&#xff0c;如为青春续航、科技为经济发展续航等。 请以“续航”为题目&#xff0c;写一篇议论文。 要求&#xff1a;论点明确&#xff0c;论据充实&…...

《微服务实战》 第二十八章 分布式锁框架-Redisson

前言 Redisson 在基于 NIO 的 Netty 框架上&#xff0c;充分的利⽤了 Redis 键值数据库提供的⼀系列优势&#xff0c;在Java 实⽤⼯具包中常⽤接⼝的基础上&#xff0c;为使⽤者提供了⼀系列具有分布式特性的常⽤⼯具类。使得原本作为协调单机多线程并发程序的⼯具包获得了协调…...

局部搜索,变邻域搜索算法

目录 局部搜索 02 变邻域搜索算法 局部搜索 1.1 局部搜索是什么玩意儿? 官方一点:局部搜索是解决优化问题的一种启发式算法。对于某些计算起来非常复杂的优化问题,比如各种NP-难问题,要找到最优解需要的时间随问题规模呈指数增长,因此诞生了各种启发式算法来退而求其次…...

软件工程实训——第一天

第一天 前后分离 前端&#xff1a;android 后端&#xff1a;springbootmbatis-plus 高心星 软件工程的思维来开发项目 问题定义 可行性研究 需求分析 概要设计 详细设计 编码 测试 维护 需求分析 1.用户的信息管理 2.新增支出 3.新增收入 4.支出统计 5.收入…...

嵌入式C语言中if/else如何优化详解

观点一&#xff08;灵剑&#xff09;&#xff1a; 前期迭代懒得优化&#xff0c;来一个需求&#xff0c;加一个if&#xff0c;久而久之&#xff0c;就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后&#xff0c;只能狠下心重构优化。那&#xff0c;有什么方案可以优雅…...

【LSTM】读取时间序列数据 | 时间序列数据的小批量划分方法

由于序列数据本质上是连续的&#xff0c;因此我们在处理数据时需要解决这个问题。当序列过长而不能被模型一次性全部处理时&#xff0c;我们希望能拆分这样的序列以便模型方便读取。 Q&#xff1a;怎样随机生成一个具有n个时间步的mini batch的特征和标签&#xff1f; A&…...

K8s in Action 阅读笔记——【12】Securing the Kubernetes API server

K8s in Action 阅读笔记——【12】Securing the Kubernetes API server 12.1 Understanding authentication 在上一章中&#xff0c;我们提到API服务器可以配置一个或多个认证插件&#xff08;授权插件也是同样的情况&#xff09;。当API服务器接收到一个请求时&#xff0c;它…...

爆肝整理,3个月从功能进阶自动化测试,一跃成测试卷王...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 首先先了解自动化…...

人生这场概率游戏,怎么玩

只会标准答案&#xff0c;是不可救药的愚蠢 那么为了便于理解&#xff0c;我用一些典型的案例来讲解&#xff0c;什么是概率游戏&#xff0c;以及这个游戏&#xff0c;应该怎么玩。 比如典型的相亲&#xff0c;婚恋。人生大事&#xff0c;用标准答案来说&#xff0c;你的意中人…...

Redis笔记

缓存过期时间很重要&#xff01;redis是单线程的 对于内存过多的3中方案&#xff1a; 惰性删除&#xff1a; 在定时删除的基础上&#xff0c;对于已经过期了的数据&#xff0c;redis的随机选择算法一直没有选中这个数据&#xff0c;所以导致它就一直没被删除&#xff0c;但是…...

centos 安装supervisor并运行网站

前言 之前一直用宝塔的**进程守护管理器【Supervisor】**来启动一些项目,如ThinkPHP、Hyperf的项目,或laravel的一些命令。如果不用宝塔怎么办呢? 一、简介[supervisor] [Supervisor] 是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支…...

Hadoop面试题十道

问题 1&#xff1a;Hadoop是什么&#xff1f; 答案&#xff1a;Hadoop是一个开源的分布式计算框架&#xff0c;用于处理大规模数据集的存储和处理。它基于Google的MapReduce和Google文件系统&#xff08;GFS&#xff09;的思想&#xff0c;旨在解决大数据量的处理和分析问题。…...

使用Docker-Compose对Docker容器集群快速编排

目录 一、Docker-Compose1、Docker-Compose使用场景2、Docker-Compose简介3、Docker-Compose安装部署4、YAML 文件格式及编写注意事项5、Docker Compose配置常用字段6、Docker Compose 常用命令7、Docker Compose 文件结构8、docker Compose撰写nginx 镜像9、docker Compose撰写…...

React-Redux 对Todolist修改

在单独使用redux的时候 需要手动订阅store里面 感觉特别麻烦 不错的是react有一个组件可以帮我们解决这个问题, 那就是react-redux。 react-redux提供了Provider 和 connent给我们使用。 先说一下几个重点知道的知识 Provider 就是用来提供store里面的状态 自动getState()co…...

初识微信小程序

新建小程序 创建一个新的微信小程序项目&#xff1a; 打开微信开发者工具&#xff0c;点击“新建项目”。 在弹出的窗口中&#xff0c;填写小程序的 AppID、项目名称和项目目录等信息。 点击“确定”按钮&#xff0c;等待微信开发者工具自动下载并安装所需的依赖库和框架。 …...

我们该如何入门编程呢

提醒&#xff1a;以下内容仅做参考&#xff0c;可自行发散。在发布作品前&#xff0c;请把不需要的内容删掉。 随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f;选择编程语言&#xff1a;选择一种编程…...

App 软件开发《判断6》试卷及答案

App 软件开发《判断6》试卷及答案 文章目录 App 软件开发《判断6》试卷及答案判断题&#xff08;对的打“√”&#xff0c;错的打“”&#xff1b;共0分&#xff09;1&#xff0e;”ionic resources --icon"命令用于生成适应不同分辨率的App图标所应用的图片。(✔)2&#…...

MVC工作原理

MVC工作原理 有视图的情况 1.客户端&#xff08;浏览器&#xff09;发起请求&#xff0c;DispatcherServlet拦截请求。 2.DispatcherServlet根据请求信息调用HandlerMapping。HandlerMapping根据uri去匹配查询能处理的Handler&#xff08;也就是我们所说的Controller&#x…...

使用 Redis 统计网站 UV 的方法

使用 Redis 统计网站 UV 的方法(概率算法) 文章目录 前言思路HyperLogLog 使用 Redis 命令操作使用 Java 代码操作 HyperLogLog 实现原理及特点使用 Java 实现 HyperLogLog小结 前言 网站 UV 就是指网站的独立用户访问量Unique Visitor&#xff0c;即相同用户的多次访问需要…...

黑客工具软件大全

黑客工具软件大全100套 给大家准备了全套网络安全梓料&#xff0c;有web安全&#xff0c;还有渗透测试等等内容&#xff0c;还包含电子书、面试题、pdf文档、视频以及相关的网络安全笔记 &#x1f447;&#x1f447;&#x1f447; 《黑客&网络安全入门&进阶学习包》 &a…...

uniapp主题切换功能的第二种实现方式(scss变量+require)

在上一篇 “uniapp主题切换功能的第一种实现方式&#xff08;scss变量vuex&#xff09;” 中介绍了第一种如何切换主题&#xff0c;但我们总结出一些不好的地方&#xff0c;例如扩展性不强&#xff0c;维护起来也困难等等&#xff0c;那么接下我再给大家介绍另外一种切换主题的…...

# 蓝牙音频相关知识

蓝牙音频相关知识 文章目录 蓝牙音频相关知识1 音频源2 蓝牙音频编解码器3 一些标准4 蓝牙音频其他相关知识4.1 蓝牙版本4.2 ANC&#xff08;主动降噪&#xff09;4.3 音响相关参数4.4 音质评价4.5 HI-Fi声音特点4.6 耳机线材4.7 耳机分类4.8 IP防尘防水等级4.9 噪音与量化噪音…...

【AI作画】使用DiffusionBee with stable-diffusion在mac M1平台玩AI作画

DiffusionBee是一个完全免费、离线的工具。它简洁易用&#xff0c;你只需输入一些标签或文本描述&#xff0c;它就能生成艺术图像。 DiffusionBee下载地址 运行DiffusionBee的硬性要求&#xff1a;MacOS系统版本必须在12.3及以上 DBe安装完成后&#xff0c;去C站挑选自己喜欢…...

网站找百度做可以嘛/西安百度快照优化

博主闭关两个多月&#xff0c;查阅了数百万字的大数据资料&#xff0c;结合自身的学习和工作经历&#xff0c;总结了大厂高频面试题&#xff0c;里面涵盖几乎所有我见到的大数据面试题目。 《大厂高频面试题系列》目前已总结4篇文章&#xff0c;且在持续更新中✍。文中用最直白…...

国外ui界面设计网站/win10优化大师有用吗

ConfigParser 是用来读取配置文件的包。配置文件的格式如下&#xff1a;中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容 创建的文件格式是cfg 文件内的格式&#xff1a; [DEFAULT] # 全局的[alex] # 用户名Password 123 # 密码Quotation 100 # 配…...

如何购买网站/百度搜索资源管理平台

题目地址(559. N 叉树的最大深度) https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/ 题目描述 给定一个 N 叉树&#xff0c;找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示&#xff0c;每组子节…...

使用word做网站/磁力狗bt

OGG12C配置环境配置&#xff1a;安装数据库Oracle12c安装源端OGG&#xff1a;oggs PORT:7809安装目标端OGG&#xff1a;oggt PORT:7909源端和目标端地址&#xff1a;127.0.0.1源端数据库&#xff1a;-----修改源数据库配置&#xff1a;SQL> sqlplus / as sysdba;SQL>a…...

建设设计网站公司/营销策划公司经营范围

前两天机房c2机子的系统崩了&#xff0c;一直要研究重新装系统的事&#xff0c;虽然是才开始接触机房&#xff0c;但是有一点必须很清楚&#xff0c;学生机c盘绝对安装了不少学生的教学软件&#xff0c;关键是这些软件必须是版本一致&#xff0c;状态一致&#xff0c;那么如果自…...

烟台开发区人才市场招聘信息/合肥网络公司seo建站

奔小康赚大钱Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2325 Accepted Submission(s): 1020Problem Description传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革&#xff1a;重新分配房…...