LeetCode 2434.使用机器人打印字典序最小的字符串:贪心(栈)——清晰题解

【LetMeFly】2434.使用机器人打印字典序最小的字符串:贪心(栈)——清晰题解

力扣题目链接:https://leetcode.cn/problems/using-a-robot-to-print-the-lexicographically-smallest-string/

给你一个字符串 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="" 。

 

提示:

  • 1 <= s.length <= 105
  • s 只包含小写英文字母。

解题方法:贪心

机器人的操作等价于:

将字符串s中的元素按顺序入栈,栈中元素按任意顺序出栈,最终所有元素都要入栈出栈,求出栈元素组成的字符串的最小字典序。

分析这道题最好的例子就是bac

首先b入栈,这时候b应该出栈吗?不应该,因为后面有更小的a,应该让a排前面;

接着将a入栈,此时栈中元素为[baa应该出栈吗?应该,因为后面元素都比a大,一旦c入栈时a还没出栈,那么c一定比a出栈早;

a出栈后b应该出栈吗?应该,和a出栈的道理相同,因为b < c

c入栈,c出栈,最终顺序abc

不知道大家有没有发现,决定一个元素是否出栈的依据是后面最小的元素是否都大于等于栈顶元素

  • 如果后面元素都大于等于栈顶元素,那么栈顶元素是时候出栈了,否则后面更大的元素入栈只会导致有更大的元素先出栈;
  • 如果后面元素有比栈顶元素更小的,那么栈顶元素就先不出栈,因为更小元素更早出栈结果更优。

具体的:

预先后续遍历一遍字符串s,求出mini数组,其中mini[i]代表s[i:n-1]的最小字符。

接着正序遍历字符串s,遍历到谁谁入栈,当栈顶元素小于等于字符串当前位置之后的所有字符时,栈顶元素不断出栈。

为了方便,也可以假设原始字符串s后面还有一个“最大”字符z

  • 时间复杂度 O ( l e n ( s ) ) O(len(s)) O(len(s))
  • 空间复杂度 O ( l e n ( s ) ) O(len(s)) O(len(s))

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-06-06 21:49:43* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-06-06 22:19:18*/
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endifclass Solution {
public:string robotWithString(string s) {vector<char> mini(s.size() + 1, 'z');for (int i = s.size() - 1; i >= 0; i--) {mini[i] = min(mini[i + 1], s[i]);}stack<char> st;string ans;for (int i = 0; i < s.size(); i++) {st.push(s[i]);while (st.size() && st.top() <= mini[i + 1]) {ans += st.top();st.pop();}}return ans;}
};
Python
'''
Author: LetMeFly
Date: 2025-06-06 21:49:43
LastEditors: LetMeFly.xyz
LastEditTime: 2025-06-06 22:30:06
'''
class Solution:def robotWithString(self, s: str) -> str:mini = ['z'] * (len(s) + 1)for i in range(len(s) - 1, -1, -1):mini[i] = min(mini[i + 1], s[i])ans = []st = []for i, c in enumerate(s):st.append(c)while st and st[-1] <= mini[i + 1]:ans.append(st.pop())return ''.join(ans)
Java
/** @Author: LetMeFly* @Date: 2025-06-06 21:49:43* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-06-06 22:38:18*/
// StringBuilder - java.lang
import java.util.Deque;
import java.util.ArrayDeque;class Solution {public String robotWithString(String s) {char[] mini = new char[s.length() + 1];mini[s.length()] = 'z';for (int i = s.length() - 1; i >= 0; i--) {mini[i] = (char) Math.min(mini[i + 1], s.charAt(i));}StringBuilder ans = new StringBuilder(s.length());Deque<Character> st = new ArrayDeque<>();for (int i = 0; i < s.length(); i++) {st.push(s.charAt(i));while (!st.isEmpty() && st.peek() <= mini[i + 1]) {ans.append(st.pop());}}return ans.toString();}
}
Go
/** @Author: LetMeFly* @Date: 2025-06-06 21:49:43* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-06-06 23:06:01*/
package mainfunc robotWithString(s string) string {mini := make([]byte, len(s) + 1)mini[len(s)] = 'z'for i := len(s) - 1; i >= 0; i-- {mini[i] = min(mini[i + 1], s[i])}st := mini[:0]ans := make([]byte, 0, len(s))for i := 0; i < len(s); i++ {st = append(st, s[i])for len(st) > 0 && st[len(st) - 1] <= mini[i + 1] {ans = append(ans, st[len(st) - 1])st = st[:len(st) - 1]}}return string(ans)
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

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

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

相关文章

影楼精修-AI衣服祛褶皱算法解析

注&#xff1a;为避免侵权&#xff0c;本文所用图像均为AIGC生成或无版权网站提供&#xff1b; 衣服祛褶皱功能&#xff0c;目前在像素蛋糕、美图云修、百度网盘AI修图、阿里云都有相关的功能支持&#xff0c;它的价值就是将不平整的衣服图像&#xff0c;变得整齐平整&#xf…

Celery 核心概念详解及示例

Celery 核心概念详解及示例 Celery 是一个简单、灵活且可靠的分布式系统&#xff0c;用于处理大量消息&#xff0c;提供对任务队列的操作&#xff0c;并支持任务的调度和异步执行。它常用于深度优化 Web 应用的性能和响应速度&#xff0c;通过将耗时的操作移到后台异步执行&am…

智能对联网页小程序的仓颉之旅

#传统楹联遇上AI智能体&#xff1a;我的Cangjie Magic开发纪实 引言&#xff1a;一场跨越千年的数字对话 "云对雨&#xff0c;雪对风&#xff0c;晚照对晴空"。昨天晚上星空璀璨&#xff0c;当我用仓颉语言写下第一个智能对联网页小程序的Agent DSL代码时&#xff0…

《ERP原理与应用教程》第3版习题和答案

ERP原理与应用教程是一门系统介绍企业资源计划(Enterprise Resource Planning, ERP)系统核心理论、技术架构及实施应用的综合性课程。它主要面向管理类、信息类、工程类等专业学生及企业管理者,旨在培养对现代企业信息化管理的理解与实践能力。以下是该课程的详细解析: 一…

SOC-ESP32S3部分:32-LVGL显示框架

飞书文档https://x509p6c8to.feishu.cn/wiki/Ly6ywvphqi6HZlk38vHcz2OgnXg LVGL是一个开源的显示框架&#xff0c;使用它可以加速我们开发带显示屏交互的应用。 IDF对于LVGL的支持一直有更新的&#xff0c;我们可以很方便在组件库中搜索到对应版本的LVGL&#xff0c;并把它添…

原理图与 PCB 设计流程及注意事项

原理图与 PCB 设计流程及注意事项 一、原理图设计 1. 首先&#xff0c;需要创建一个新的项目&#xff0c;在此项目中建立原理图。 2. 接着&#xff0c;在原理图中添加元件和芯片。可以从元件库中挑选所需的元件&#xff0c;如电阻、电容等。既可以在元件库中进行搜索查找&…

LeetCode--23.合并k个升序链表

解题思路&#xff1a; 1.获取信息&#xff1a; 给出了多个升序链表&#xff0c;要求合并成一个升序链表&#xff0c;返回首元结点 2.分析题目&#xff1a; 外面在21题的时候&#xff0c;讲了怎样合并两个升序链表为一个升序链表&#xff0c;不了解的&#xff0c;建议去看一下21…

【国产化适配】如何选择高效合规的安全数据交换系统?

一、安全数据交换系统的核心价值与国产化需求 在数字化转型浪潮中&#xff0c;企业数据流动的频率与规模呈指数级增长&#xff0c;跨网文件传输已成为日常运营的刚需&#xff0c;所以安全数据交换系统也是企业必备的工具。然而&#xff0c;数据泄露事件频发、行业合规要求趋严…

JMM初学

文章目录 1,线程间的同步和通信1.1, 共享内存并发模型 (Shared Memory Model)线程通信机制线程同步机制特点 1.2, 消息传递并发模型 (Message Passing Model)线程通信机制线程同步机制特点 适用场景对比 2,Java内存模型JMM2.0,Java内存模型的基础&#xff08;1&#xff09;内存…

【动手学MCP从0到1】2.5 MCP中的Context日志输出、进度汇报和服务端调用客户端的大模型项目实现步骤详解

MCP中的Context 1. Context2. 日志输出2.1 服务端2.2 客户端2.2.1 客户端代码调试2.2.2 客户端全部代码 3. 进度汇报3.1 服务端3.2 客户端3.2.1 客户端代码调试3.2.2 客户端全部代码 4. 模型调用4.1 服务端4.2 客户端4.2.1 客户端代码调试4.2.2 客户端全部代码 1. Context Con…

QT自定义资源管理器

使用qt 和 C实现。还在优化中 项目地址:GitHub - Linda1226/FileResourceManager: 自定义资源管理器 有问题可以交流

[华为eNSP] OSPF综合实验

目录 配置流程 画出拓扑图、标注重要接口IP 配置客户端IP 配置服务端IP 配置服务器服务 配置路由器基本信息&#xff1a;名称和接口IP 配置路由器ospf协议 测试结果 通过配置OSPF路由协议&#xff0c;实现跨多路由器的网络互通&#xff0c;并验证终端设备的访问能力。 …

如何把本地服务器变成公网服务器?内网ip网址转换到外网连接访问

​ 内网IP只能在本地内部网络连接访问&#xff0c;当本地搭建服务器部署好相关网站或应用后&#xff0c;在局域网内可以通过内网IP访问&#xff0c;但在外网是无法直接访问异地内网IP端口应用的&#xff0c;只有公网IP和域名才能实现互联网上的访问。那么需要如何把本地服务器变…

Linux-文件管理及归档压缩

1.根下的目录作用说明&#xff1a; /&#xff1a;Linux系统中所有的文件都在根下/bin&#xff1a;(二进制命令目录)存放常用的用户命令/boot&#xff1a;系统启动时的引导文件&#xff08;内核的引导配置文件&#xff0c;grub配置文件&#xff0c;内核配置文件&#xff09; 例…

从零开始的python学习(七)P95+P96+P97+P98+P99+P100+P101

本文章记录观看B站python教程学习笔记和实践感悟&#xff0c;视频链接&#xff1a;【花了2万多买的Python教程全套&#xff0c;现在分享给大家&#xff0c;入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…

Linux 查找特定字符详细讲解

CentOS 7 中使用 grep 查找特定字符详细笔记​ 一、grep 命令概述​ grep 全称为 Global Regular Expression Print&#xff0c;即全局正则表达式打印&#xff0c;是 CentOS 7 系统中用于文本搜索的核心工具。它基于正则表达式或固定字符串&#xff0c;在文件、标准输入流中进…

uniappx插件nutpi-idcard 开发与使用指南(适配鸿蒙)

uniappx插件nutpi-idcard 开发与使用指南&#xff08;适配鸿蒙&#xff09; 前言 nutpi-idcard 是一个基于 UTS (uni-app TypeScript Syntax) 开发的 uni-app 插件适配鸿蒙&#xff0c;主要用于解析身份证号码&#xff0c;提取其中的关键信息&#xff0c;如地区、出生日期、性…

Grafana-ECharts应用讲解(玫瑰图示例)

工具: MySQL 数据库 MySQL Workbench 数据库管理工具(方便编辑数据) Grafana v11.5.2 Business Charts 6.6(原 Echarts插件) 安装 安装 MySQL社区版安装 MySQL Workbench安装 Grafana在 Grafana 插件中搜索 Business Charts 进行安装以上安装步骤网上教程很多,自行搜…

React状态管理Context API + useReducer

在 React 中&#xff0c;Context API useReducer 是一种轻量级的状态管理方案&#xff0c;适合中小型应用或需要跨组件共享复杂状态的场景。它避免了 Redux 的繁琐配置&#xff0c;同时提供了清晰的状态更新逻辑。 1. 基本使用步骤 (1) 定义 Reducer 类似于 Redux 的 reduce…

3 个优质的终端 GitHub 开源工具

1、Oh My Zsh Oh My Zsh 是一个帮助你管理和美化 zsh 终端的开源工具。它让你的终端更炫酷、更高效。安装后&#xff0c;你可以快速使用各种插件和主题&#xff0c;比如常见的 git 命令简化、支持多种编程语言工具等&#xff0c;每次打开终端都会有惊喜。无论你是开发者还是普…