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

算法随笔_64: 含特定字母的最小子序列

上一篇:算法随笔_63: 子数组范围和-CSDN博客

=====

题目描述如下:

给你一个字符串 s ,一个整数 k ,一个字母 letter 以及另一个整数 repetition 。

返回 s 中长度为 k 且 字典序最小 的子序列,该子序列同时应满足字母 letter 出现 至少 repetition 次。生成的测试用例满足 letter 在 s 中出现 至少 repetition 次。

子序列 是由原字符串删除一些(或不删除)字符且不改变剩余字符顺序得到的剩余字符串。

字符串 a 字典序比字符串 b 小的定义为:在 a 和 b 出现不同字符的第一个位置上,字符串 a 的字符在字母表中的顺序早于字符串 b 的字符。

示例 1:

输入:s = "leet", k = 3, letter = "e", repetition = 1
输出:"eet"
解释:存在 4 个长度为 3 ,且满足字母 'e' 出现至少 1 次的子序列:
- "lee"("leet")
- "let"("leet")
- "let"("leet")
- "eet"("leet")
其中字典序最小的子序列是 "eet" 。

=====

算法思路:

我们这里用e代表题目中的letter以方便描述。由于题目要求的条件比较多,我们先考虑简单的情况,即,如何找到 s 中长度为 k 且字典序最小的子序列。

对于所有长度为k的子序列,第一个字符肯定要是字典序最小的。如果有多个子序列,它们的第一个字符字典序最小且相同,那么我们需要从它们当中找出第二个字符字典序最小的那些序列。以此类推,直到找出符合条件的子序列。

其实这就是要求我们从原字符串中找出: 最小字符,次小字符,第三小字符,等等,这样一个字符串,且它们的索引必须是递增的。因此我们可以使用“栈”的数据结构来找出它们。算法如下:

1. 我们设数组res做为此栈。设s_len为s的长度。

2. 然后我们从左往右枚举原字符串s。只要s[i] < res[-1],我们弹出栈顶元素res[-1]。重复此判断直到s[i] >= res[-1]。我们把s[i]放入res。

注: 由于我们需要维持总长度k,所以在步骤2中有时不能把res里的元素全部弹出,需要保证以下不等式成立:

(res长度+ [i, n-1]长度) >= k

对于不能弹出的情况,直接把s[i]放入res。

枚举完成后,res中存储的就是: 最小字符,次小字符,第三小字符,等等,这样一个字符串,且它们的索引是递增的。如果res长度大于k,我们取res中的前k个元素即为最终答案。

好了,到此时,我们就解决了题目中的一个条件。下面,我们再来看如何满足其他条件。题目还要求字母 letter 出现 至少 repetition 次。

我们发现答案中的第一个字符不可能取在倒数第repetition个e之后,因为那样的话,最后的结果e数肯定少于repetition。因此我们需要先找到倒数第repetition个e的索引,把它做为一个判断的基准,我们设变量eKeyInd来储存这个值。那么在eKeyInd之前的字符串也尽量要找出,最小字符,次小字符,第三小字符,等等。和上面的算法原理一样。

为了方便后面描述,我们再设两个变量:

eResCnt: 表示已经在res中的e的数量。

eLeftCnt: 表示eKeyInd之后还剩下e的数量,包括eKeyInd处的e。初始值为repetition。

在枚举到eKeyInd时,res会有两种情况:

1. res长度+eLeftCnt >= k,这时我们取res的前(k-eLeftCnt)个字符,然后加上eLeftCnt个e即为最终的答案。

2. res长度+eLeftCnt < k,由于不足以形成k个字符,因此我们需要从eKeyInd到下一个e出现的索引中间再尝试找出一段递增的字符串。这样形成一个新的res。由于eKeyInd处的e已经添加进去res,因此eLeftCnt需要减1。然后重复判断这两种情况,直至找出答案。

在弹出栈顶的过程中,如果碰到栈顶res[-1]字符为e时,我们还需要确保eResCnt+eLeftCnt>repetition。这样才能弹出e,且eResCnt要减1。否则不能弹出e。

同时,在入栈时,如果当前字符为e,也要相应把eResCnt加1。

对于额外的条件满足,算法总体的思路就是上面提到的两种情况。其他的地方就是要注意一些细节的判断,以保证最后算法的准确。

算法的时间复杂度为O(n)。下面是Python代码实现:

class Solution(object):def smallestSubsequence(self, s, k, letter, repetition):""":type s: str:type k: int:type letter: str:type repetition: int:rtype: str"""s_len=len(s)res=[]eKeyInd=0eLeftCnt=0eResCnt=0for i in range(s_len-1, -1, -1):if s[i]==letter:eLeftCnt+=1if eLeftCnt==repetition:eKeyInd=ibreakfor i in range(s_len):while res and s[i]<res[-1] and len(res)+s_len-i > k:if res[-1]==letter:if eResCnt+eLeftCnt==repetition:breakelse:eResCnt-=1res.pop()if s[i]==letter and i>=eKeyInd:if len(res)+eLeftCnt>=k:breakelse:eLeftCnt-=1res.append(s[i])if s[i]==letter:eResCnt+=1res=res[:k-eLeftCnt]+[letter]*eLeftCntres="".join(res)return res

关键词: 单调栈

相关文章:

算法随笔_64: 含特定字母的最小子序列

上一篇:算法随笔_63: 子数组范围和-CSDN博客 题目描述如下: 给你一个字符串 s &#xff0c;一个整数 k &#xff0c;一个字母 letter 以及另一个整数 repetition 。 返回 s 中长度为 k 且 字典序最小 的子序列&#xff0c;该子序列同时应满足字母 letter 出现 至少 repetitio…...

red hat系统离线部署Deepseek

一个人在单位离线部署踩了不少坑&#xff0c;记录一下 模型准备 1.huggingface下载gguf文件&#xff0c;将文件放到相应目录(例如E:/AI文件夹) 2.在文件夹内用文本建一个文件&#xff0c;命名Modelfile(删除txt后缀) 3.用文本编辑器打开Modelfile&#xff0c;在文本内输入 fr…...

torch.einsum 的 10 个常见用法详解以及多头注意力实现

torch.einsum 是 PyTorch 提供的一个高效的张量运算函数&#xff0c;能够用紧凑的 Einstein Summation 约定&#xff08;Einstein Summation Convention, Einsum&#xff09;描述复杂的张量操作&#xff0c;例如矩阵乘法、转置、内积、外积、批量矩阵乘法等。 1. 基本语法 tor…...

【DeepSeek】一文详解GRPO算法——为什么能减少大模型训练资源?

GRPO&#xff0c;一种新的强化学习方法&#xff0c;是DeepSeek R1使用到的训练方法。 今天的这篇博客文章&#xff0c;笔者会从零开始&#xff0c;层层递进地为各位介绍一种在强化学习中极具实用价值的技术——GRPO&#xff08;Group Relative Policy Optimization&#xff09…...

C++基础系列【19】运算符重载

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1f…...

大数据环境(单机版) Flume传输数据到Kafka

文章目录 前言一、准备二、安装三、配置环境变量四、修改配置4.1、kafka配置4.2、Flume配置 五、启动程序5.1、启动zk5.2、启动kafka5.3、启动flume 六、测试6.1、启动一个kafka终端&#xff0c;用来消费消息6.2、写入日志 其他 前言 flume监控指定目录&#xff0c;传输数据到…...

Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!

Ollama 是一款开源的本地大语言模型&#xff08;LLM&#xff09;运行框架&#xff0c;用于管理和运行语言模型。具有以下核心特点&#xff1a; 开源可定制&#xff1a;采用 MIT 开源协议&#xff0c;开发者能自由使用、阅读源码并定制&#xff0c;可根据自身需求进行功能扩展和…...

开发环境搭建-03.后端环境搭建-使用Git进行版本控制

一.Git进行版本控制 我们对项目开发就会产生很多代码&#xff0c;我们需要有效的将这些代码管理起来&#xff0c;因此我们真正开发代码前需要把我们的Git环境搭建好。通过Git来管理我们项目的版本&#xff0c;进而实现版本控制。 首先我们使用Git创建本地仓库&#xff0c;然后…...

[Lc(2)滑动窗口_1] 长度最小的数组 | 无重复字符的最长子串 | 最大连续1的个数 III | 将 x 减到 0 的最小操作数

目录 1. 长度最小的字数组 题解 代码 ⭕2.无重复字符的最长子串 题解 代码 3.最大连续1的个数 III 题解 代码 4.将 x 减到 0 的最小操作数 题解 代码 1. 长度最小的字数组 题目链接&#xff1a;209.长度最小的字数组 题目分析: 给定一个含有 n 个 正整数 的数组…...

互联网时代如何保证数字足迹的安全,以防个人信息泄露?

用户在网络上所做的几乎所有事情&#xff0c;包括浏览、社交媒体活动、搜索查询、在线订阅&#xff0c;甚至购物&#xff0c;都会留下一条数据线索&#xff0c;这些数据可用于创建用户在线身份的详细档案。如果这些信息暴露&#xff0c;恶意行为者可能会利用它们将用户置于各种…...

海康摄像头接入流媒体服务器实现https域名代理播放

环境 操作系统&#xff1a;Ubuntu 22.04流媒体服务器&#xff1a;srs 官网安装教程srs开启GB28181协议 官网开启教程进行海康摄像头的配置 官网配置教程srs使用systemctl实现开机自启 官网配置教程 nginx配置说明 server {listen 80;server_name a.com;return 301 https://$…...

【C++设计模式】第五篇:原型模式(Prototype)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 克隆对象的效率革命 1. 模式定义与用途​ ​ 核心思想​ ​原型模式&#xff1a;通过复制现有对象​&#xff08;原型&#xff09;来创建新对象&#xff0c;而非通过new构造。​关键用…...

51单片机课综合项目

1、按键控制蜂鸣器实验 1、实验现象&#xff1a;下载程序后&#xff0c;按下K1键蜂鸣器发声一次&#xff0c;按下K2键&#xff0c;蜂鸣器连续发声&#xff0c;再次按下K2键&#xff0c;发声取消 2、使用到的外设模块:蜂鸣器模块beep 独立按键模块 key 3、编程框架&#xff08;…...

【最大半连通子图——tarjan求最大连通分量,拓扑排序,树形DP】

题目 分析 最大连通分量肯定是满足半连通分量的要求&#xff0c;因此tarjan。 同时为了简化图&#xff0c;我们进行缩点&#xff0c;图一定变为拓扑图。 我们很容易看出&#xff0c;只要是一条不分叉的链&#xff0c;是满足条件的。 于是我们按照拓扑序不断树形DP 建边注意…...

一周学会Flask3 Python Web开发-在模板中渲染WTForms表单视图函数里获取表单数据

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 为了能够在模板中渲染表单&#xff0c;我们需要把表单类实例传入模板。首先在视图函数里实例化表单类LoginForm&#xff0c;然…...

DeepSeek R1助力,腾讯AI代码助手解锁音乐创作新

目录 1. DeepSeekR1模型简介2. 歌词创作流程2.1 准备工作2.2 歌词生成技巧 3. 音乐制作环节3.1 主流AI音乐生成平台 4. 歌曲欣赏5. 总结展望 1. DeepSeekR1模型简介 腾讯AI代码助手最新推出的DeepSeekR1模型不仅在代码生成方面表现出色&#xff0c;其强大的自然语言处理能力也…...

用户空间与内核空间切换机制详解

用户空间与内核空间切换机制详解 一、切换触发条件 用户态与内核态的切换由以下三类事件触发: ‌系统调用‌ 用户程序主动通过int 0x80(x86)或ecall(RISC-V)等指令发起系统调用,请求内核服务(如文件读写、进程创建等)。此时CPU自动进入内核态处理请求,完成后返回用户…...

【微信小程序】每日心情笔记

个人团队的比赛项目&#xff0c;仅供学习交流使用 一、项目基本介绍 1. 项目简介 一款基于微信小程序的轻量化笔记工具&#xff0c;旨在帮助用户通过记录每日心情和事件&#xff0c;更好地管理情绪和生活。用户可以根据日期和心情分类&#xff08;如开心、平静、难过等&#…...

为AI聊天工具添加一个知识系统 之135 详细设计之76 通用编程语言 之6

本文要点 要点 通用编程语言设计 本设计通过三级符号系统的动态映射与静态验证的有机结合&#xff0c;实现了从文化表达到硬件优化的全链路支持。每个设计决策均可在[用户原始讨论]中找到对应依据&#xff0c;包括&#xff1a; 三级冒号语法 → 提升文化符号可读性圣灵三角…...

前端基础之组件

组件&#xff1a;实现应用中局部功能代码和资源的集合 非单文件组件 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

spring boot整合flyway实现数据的动态维护

1、简单介绍一下flyway Flyway 是一款开源的数据库版本控制工具&#xff0c;主要用于管理数据库结构的变更&#xff08;如创建表、修改字段、插入数据等&#xff09;。它通过跟踪和执行版本化的迁移脚本&#xff0c;帮助团队实现数据库变更的自动化。接下来简单介绍一下flyway…...

通往 AI 之路:Python 机器学习入门-线性代数

2.1 线性代数&#xff08;机器学习的核心&#xff09; 线性代数是机器学习的基础之一&#xff0c;许多核心算法都依赖矩阵运算。本章将介绍线性代数中的基本概念&#xff0c;包括标量、向量、矩阵、矩阵运算、特征值与特征向量&#xff0c;以及奇异值分解&#xff08;SVD&…...

Matlab中的均值函数mean

今天调了一个代码里的bug&#xff0c;根源居然是mean函数的使用细节没留意到~ 具体来说&#xff0c;写一个类似k均值聚类那样的程序&#xff0c;交替迭代&#xff0c;其中有一部是使用mean求一堆向量的均值&#xff0c;这些向量存在一个矩阵里&#xff0c;每行对应一个向量。若…...

数据结构知识学习小结

一、动态内存分配基本步骤 1、内存分配简单示例&#xff1a; 个人对于示例的理解&#xff1a; 定义一个整型的指针变量p&#xff08;着重认为它是一个“变量”我觉得可能会更好理解&#xff09;&#xff0c;这个变量用来存地址的&#xff0c;而不是“值”&#xff0c;malloc函…...

高精算法的用法及其优势

高精度问题是指当数据的位数非常大&#xff08;超出标准数据类型的范围&#xff09;时&#xff0c;如何进行计算和存储的问题。常见场景包括大整数的加、减、乘、除、取模等操作。以下是解决高精度问题的常用方法与技巧&#xff1a; 一、数据存储 数组存储 用整型数组存储&am…...

【Spring AOP】_切点类的切点表达式

目录 1. 根据方法签名匹配编写切点表达式 1.1 具体语法 1.2 通配符表达规范 2. 根据注解匹配编写切点表达式 2.1 实现步骤 2.2 元注解及其常用取值含义 2.3 使用自定义注解 2.3.1 编写自定义注解MyAspect 2.3.2 编写切面类MyAspectDemo 2.3.3 编写测试类及测试方法 在…...

多线程-定时任务线程池源码

定时任务线程池 ScheduledThreadPoolExecutor&#xff0c;可以执行定时任务的线程池。这里学习它的基本原理。 定时任务线程池&#xff0c;和普通线程池不同的地方在于&#xff0c;它使用一个延迟队列&#xff0c;延迟队列使用最小堆作为它的数据结构&#xff0c;它会按照任务…...

初次使用 IDE 搭配 Lombok 注解的配置

前言 在 Java 开发的漫漫征程中&#xff0c;我们总会遇到各种提升效率的工具。Lombok 便是其中一款能让代码编写变得更加简洁高效的神奇库。它通过注解的方式&#xff0c;巧妙地在编译阶段为我们生成那些繁琐的样板代码&#xff0c;比如 getter、setter、构造函数等。然而&…...

云服数据存储接口:CloudSever

云服数据存储接口&#xff1a;CloudSever 迷你世界 更新时间: 2024-04-28 19:09:10 具体函数名及描述如下&#xff1a; 序号 函数名 函数描述 1 setOrderDataBykey(...) 设置排行榜中指定键的数值 2 removeOrderDataByKey(...) 删除排行榜中指定键的数值 …...

关于 QPalette设置按钮背景未显示出来 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/146047054 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...