【数据结构-栈】【贪心】力扣2434. 使用机器人打印字典序最小的字符串

给你一个字符串 s 和一个机器人,机器人当前有一个空字符串 t 。执行以下操作之一,直到 s 和 t 都变成空字符串:

删除字符串 s 的 第一个 字符,并将该字符给机器人。机器人把这个字符添加到 t 的尾部。
删除字符串 t 的 最后一个 字符,并将该字符给机器人。机器人将该字符写到纸上。
请你返回纸上能写出的字典序最小的字符串。

示例 1:
输入:s = “zza”
输出:“azz”
解释:用 p 表示写出来的字符串。
一开始,p=“” ,s=“zza” ,t=“” 。
执行第一个操作三次,得到 p=“” ,s=“” ,t=“zza” 。
执行第二个操作三次,得到 p=“azz” ,s=“” ,t=“” 。

示例 2:
输入:s = “bac”
输出:“abc”
解释:用 p 表示写出来的字符串。
执行第一个操作两次,得到 p=“” ,s=“c” ,t=“ba” 。
执行第二个操作两次,得到 p=“ab” ,s=“c” ,t=“” 。
执行第一个操作,得到 p=“ab” ,s=“” ,t=“c” 。
执行第二个操作,得到 p=“abc” ,s=“” ,t=“” 。

示例 3:
输入:s = “bdda”
输出:“addb”
解释:用 p 表示写出来的字符串。
一开始,p=“” ,s=“bdda” ,t=“” 。
执行第一个操作四次,得到 p=“” ,s=“” ,t=“bdda” 。
执行第二个操作四次,得到 p=“addb” ,s=“” ,t=“” 。

在这里插入图片描述

栈+贪心

class Solution {
public:
    string robotWithString(string s) {
        string ans;
        int cnt[26]{}, min = 0;
        for(char c : s) ++cnt[c -'a'];
        stack<char> st;
        for(char c : s){
            st.push(c);
            --cnt[c - 'a'];
            while(min < 25 && cnt[min] == 0) ++min;
            while(!st.empty() && st.top() - 'a' <= min){
                ans += st.top();
                st.pop();
            }
        }
        return ans;
    }
};

时间复杂度:O(n+∣Σ∣),其中 n 为 s 的长度,∣Σ∣ 为字符集合的大小,本题中字符均为小写字母,所以 ∣Σ∣=26。注意到每个字母只会入栈出栈各一次,且 min 只增不减,因此时间复杂度为 O(n+∣Σ∣)。
空间复杂度:O(n+∣Σ∣)。最坏情况下栈需要 O(n) 的空间。

这道题的难点在于我们什么时候要执行操作1和什么时候要执行操作2。我们可以思考,将t想象成一个栈,先进后出,然后当栈顶元素的值,也就是t的末尾的值比字符串s中的任何一个字符都要小的时候,那么我们就要将栈顶元素推入p中,也就是写出来的字符串,这样才能保证最小字典序列。

那么我们该如何判断s字符串的字符都有多少呢?我们采用一个动态数组cnt来计算s中每个存在字符出现的次数。

由于我们最后从s到栈t,一定是经过s.size()次的st.push,然后又只有两种操作,所以我们可以在每次for循环中进行操作一,然后通过while判断进行多少次操作二,交替进行。

我们采用了一个while判断来确定字符串s中当前存在的最小字符是多少, while(min < 25 && cnt[min] == 0) ++min;,由于0代表a,1代表b…说明第一次cnt[min]不为0的时候,就是s的最小字符。

然后我们将t中的栈顶元素和这个最小字符进行比较,如果栈顶元素小于等于这个最小字符,则执行操作二。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

让AI像人一样思考和使用工具,reAct机制详解

reAct机制详解 reAct是什么reAct的关键要素reAct的思维过程reAct的代码实现查看效果引入依赖&#xff0c;定义模型定义相关工具集合工具创建代理启动测试完整代码 思考 reAct是什么 reAct的核心思想是将**推理&#xff08;Reasoning&#xff09;和行动&#xff08;Acting&…

SDH8303直插DIP8,7W-12W非隔离升压降压转换器

SDH8303是用于开关电源的内置高压 MOSFET 的电流模式 PWM 控制器&#xff0c;采用DIP-8封装&#xff0c;全电压下典型功率7W-12W。 SDH8303芯片内置高压启动电路&#xff0c;在轻载下会进入打嗝模式&#xff0c;具有降频、抖频、软启动、VDD 打嗝功能&#xff0c;还集成了 VDD …

猿人学 — 第1届第17题(解题思路附源码)

猿人学 — 第1届第17题 根据题目“天杀的Http2.0”大概知道&#xff0c;请求的协议应该遵照的是Http2.0协议&#xff0c;并且目标网站专门对此进行了检测&#xff0c;在Network面板中右键表头&#xff0c;勾选Protocol 果不其然&#xff0c;一堆请求都是遵照Http2.0协议。而u…

论文阅读 BLIP-2

Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 使用冻结的图像编码器和大型语言模型进行语言-图像预训练的引导 BLIP-2 通过一个轻量级的查询变换器弥合了模态之间的差距。 Querying Transformer 第一阶段通过冻结的图像编…

Word排版 | 如何文字部分固定行距、图片(嵌入型)单倍行距

问题描述 在写一个要求比较高的项目报告&#xff0c;总共有109页 89张图片&#xff0c;而且必须用word写 因此&#xff1a; 文字部分需要固定行距23磅图片部分需要单倍行距&#xff08;不然无法使用嵌入式&#xff09; 难点 文字和图片难以有效分离&#xff0c;无法分别设…

3D渲图软件推荐:打造高质量渲染效果

在现代设计领域&#xff0c;3D渲图已经成为展示设计方案和产品外观的重要手段。无论是建筑设计、产品设计还是影视动画&#xff0c;都需要借助专业的3D渲染图软件来实现逼真的视觉效果。 本文将为您介绍几款备受好评的3D渲染图软件&#xff0c;帮助您在项目中选择合适的工具。…

筛选因数快速法+map

前言&#xff1a;老是忘记怎么快速筛选因数&#xff0c;我们只需要枚举小于sqrt&#xff08; num &#xff09; 的数&#xff0c;这样可以降低很多复杂度&#xff0c;而且我们的因数一定是成对出现的&#xff0c;所以我们遇到一个因数的时候x&#xff0c;判断 x 2 x^2 x2 是否…

【华为】配置RIP协议

RIP&#xff08;Routing Information Protocol&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于小型网络中的动态路由。RIP有两个主要版本&#xff1a;‌RIPv1和‌RIPv2&#xff0c;它们之间存在一些关键区别&#xff1a; ‌分类支持‌&#xf…

STM32之CAN外设

相信大家在学习STM32系列的单片机时&#xff0c;在翻阅芯片的数据手册时&#xff0c;都会看到这么一个寄存器外设——CAN外设寄存器。那么&#xff0c;大家知道这个外设的工作原理以及该如何使用吗&#xff1f;这节的内容将会详细介绍STM32上的CAN外设&#xff0c;文章结尾附有…

树的中心——dfs

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M N*2; int h[N], e[M], ne[M], idx; int n; int ans 2e9; bool st[N]; void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h[a], h[a] idx ; } int dfs(int u) {int…

系统移植一

使用设备是fs4412开发板 一、系统移植 系统移植是将一个操作系统或软件从一个硬件平台或处理器架构转移到另一个平台的过程。系统移植的主要目标是使软件在新的硬件环境下能够正常运行。在系统移植过程中&#xff0c;主要的改动集中在硬件相关的底层部分以及操作系统的核心模…

低代码工单管理app评测,功能与效率解析

预计到2030年&#xff0c;低代码平台市场将达1870亿美元。ZohoCreator助力企业构建定制化软件应用&#xff0c;以建筑行业工作订单管理app为例&#xff0c;简化流程&#xff0c;提升管理效率&#xff0c;降低成本。其用户友好界面、自动化管理、跨平台使用及全面报告功能受企业…

【高频SQL基础50题】31-35

又到SQL。 目录 1.查询结果的质量和占比 2.求关注者的数量 3.指定日期的产品价格 4.好友申请 II &#xff1a;谁有最多的好友 5.按日期分组销售产品 1.查询结果的质量和占比 聚合题。 # Write your MySQL query statement below SELECT t1.query_name,ROUND((SUM(t1.r…

【Linux探索学习】第四弹——Linux权限管理详解:理解用户、组和权限之间的关系

前言&#xff1a; 在前面我们已经学习了Linux的基础指令&#xff0c;相信大家对Linux已经有了一定的认识&#xff0c;今天我们来学习Linux权限的相关知识点&#xff0c;Linux权限是Linux初学者必须要掌握的内容 目录 一、Linux下用户类型 二、权限基本概念 三、权限的表示 四…

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址&#xff1a;GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了&#xff0c;可以参考其他…

数据结构修炼——树?二叉树?堆?从入门到代码实现,第一弹!!!

目录 一、树的概念与结构1.1 树的概念1.2 树的相关概念1.3 树的表示及实际应用 二、二叉树概念及结构2.1 二叉树的概念2.2 特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 2.3 二叉树的存储结构 三、二叉树的顺序结构与实现3.1 堆的概念及结构3.2 堆的实现3.2.1 堆的创建与销毁3.…

安卓13禁止用户打开开发者选项 android13禁止用户打开开发者选项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号,一般的话,在这里连续点击就可以打开我们的开发者选项了。但是有些系统要进行保密,因此要禁止用户进入。 2.问题分析 这里我们是通过点…

Android Framework AMS(02)AMS启动及相关初始化5-8

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第二章节&…

【技术】Jaskson的序列化与反序列化

文章目录 概念解释1.Jasksona.JSONJSON 的基本特点JSON 的基本结构JSON 示例 b.ObjectMapper类 2.序列化与反序列化a.序列化对象序列化集合序列化ListSetMap b.反序列化反序列化单个对象反序列化集合对象 概念解释 1.Jaskson Jackson 是一个用于处理 JSON 数据的 Java 库,所以…

vue-插槽作用域实用场景

vue-插槽作用域实用场景 1.插槽1.1 自定义列表渲染1.2 数据表格组件1.3 树形组件1.4 表单验证组件1.5 无限滚动组件 1.插槽 插槽感觉知道有这个东西&#xff0c;但是挺少用过的&#xff0c;每次看到基本都会再去看一遍用法和概念。但是在项目里&#xff0c;自己还是没有用到过…