【力扣】2434.使用机器人打印字典序最小的字符串

1、题目描述:

在这里插入图片描述

2、测试用例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、解题思路

  • 每次删除字符串s的第一个字符,可以将s看做队列,每次从头部出。
  • 在t的尾端插入或删除,可以将t看做栈
  • 栈顶元素出栈条件:①比即将入栈的元素小并且比s中剩下的还没有入栈的所有字符都小②s中已经没有字符
class Solution {public String robotWithString(String s) {//s从头开始遍历//t从尾部开始StringBuilder s1 = new StringBuilder(s);Stack<Character> t = new Stack<>();StringBuilder m = new StringBuilder();int i = 0;boolean isDoen = false; //用于判断第一个“最小的字符”是否入栈//找出最小字符char minChar = (char) s.chars().min().orElseThrow(()-> new RuntimeException("No minimum character found.")) ;while (i <  s.length()){char c = s.charAt(i);if(s.charAt(i) == minChar){isDoen = true;//在遇到第一个"最小字符"之前,都不入栈!!!m.append(s.charAt(i));s1.deleteCharAt(0);i++;}else {char minChar1 = (char) s1.chars().min().orElseThrow(()-> new RuntimeException("No minimum character found."));//将t中比s尾部小的元素弹出加在m末尾,直到第一个比s.char(i)大的字符while (!t.isEmpty() && t.peek() <= c && isDoen && t.peek() <= minChar1){//在出栈之前还应判断剩下的元素是否还有比栈顶小的元素m.append(t.pop());}//栈顶元素大于等于c,将c入栈t.push(c);s1.deleteCharAt(0);i++;}}//将t中剩余元素全部出栈while (!t.isEmpty()){m.append(t.pop());}return m.toString();}
}

在这里插入图片描述

4、效率改进

public String robotWithString(String s) {//s从头开始遍历//t从尾部开始int n = s.length();String s1 = s;Stack<Character> t = new Stack<>();StringBuilder m = new StringBuilder();//int i = 0;//boolean isDoen = false; //用于判断第一个“最小的字符”是否入栈//找出最小字符,统计每个位置之后(包括当前位置)的最小字符个数//char minChar = (char) s.chars().min().orElseThrow(()-> new RuntimeException("No minimum character found.")) ;//统计每个位置之后(包含当前)最小的字符char[] minFromRight = new char[n];minFromRight[n - 1] = s.charAt(n - 1);for (int i = n - 2; i >= 0; i--) {minFromRight[i] = (char) Math.min(s.charAt(i), minFromRight[i + 1]);}for (int i = 0; i < n; i++){char c = s.charAt(i);while (!t.isEmpty() && t.peek() <= c && t.peek() <= minFromRight[i]){m.append(t.pop());}t.push(c);}//        while (i <  s.length()){
//            char c = s.charAt(i);
//            if(s.charAt(i) == minChar){
//                isDoen = true;
//                //在遇到第一个"最小字符"之前,都不入栈!!!
//                m.append(s.charAt(i));
//                s1= s1.substring(1);
//                i++;
//            }else {
//                char minChar1 = (char) s1.chars().min().orElseThrow(()-> new RuntimeException("No minimum character found."));
//                //将t中比s尾部小的元素弹出加在m末尾,直到第一个比s.char(i)大的字符
//                while (!t.isEmpty() && t.peek() <= c && isDoen && t.peek() <= minChar1){
//                    //在出栈之前还应判断剩下的元素是否还有比栈顶小的元素
//                    m.append(t.pop());
//                }
//                //栈顶元素大于等于c,将c入栈
//                t.push(c);
//                s1= s1.substring(1);;
//                i++;
//            }
//        }//将t中剩余元素全部出栈while (!t.isEmpty()){m.append(t.pop());}return m.toString();}

4.1 改进点1

不断创建StringBuilder 并调用 deleteCharAt(0)从字符串头部删除字符,这种方式效率较低,因为每次删除操作都需要移动数组元素,时间复杂度为 O(n²)

✅ 优化目标

  • 避免频繁使用 deleteCharAt(0)。
  • 使用索引遍历原字符串,避免修改原始字符串副本。
  • 提高整体时间复杂度至 O(n)。

4.2 改进点2

多次调用 s1.chars().min() 导致重复扫描。
✅ 优化目标:改进使用该函数的方式,预处理一个 minFromRight 数组,保存从当前位置开始的最小字符

在这里插入图片描述
在这里插入图片描述

5、官方答案

在这里插入图片描述

class Solution {public String robotWithString(String s) {int[] cnt = new int[26];for (char c : s.toCharArray()) {cnt[c - 'a']++;}Stack<Character> stack = new Stack<>();StringBuilder res = new StringBuilder();char minCharacter = 'a';for (char c : s.toCharArray()) {stack.push(c);cnt[c - 'a']--;while (minCharacter != 'z' && cnt[minCharacter - 'a'] == 0) {minCharacter++;}while (!stack.isEmpty() && stack.peek() <= minCharacter) {res.append(stack.pop());}}return res.toString();}
}

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

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

相关文章

业务材料——半导体行业MES系统核心功能工业协议AI赋能

一、前置概念 半导体行业 半导体行业主要生产基于半导体材料&#xff08;如硅、锗、化合物半导体等&#xff09;的电子元器件及相关产品&#xff0c;广泛应用于计算、通信、能源、医疗等领域。 MES系统 MES系统&#xff08;Manufacturing Execution System&#xff0c;制造…

视频的分片上传,断点上传

​ 上传功能的实现&#xff0c;点击上传按钮&#xff0c;判断添加的文件是否符合要求&#xff0c;如果符合把他放入文件列表中&#xff0c;并把他的状态设置为等待中&#xff0c;对于每个文件&#xff0c;把他们切分为chunksize大小的文件片段&#xff0c;再检查他的状态是否为…

指针的定义与使用

1.指针的定义和使用 int point1(){//定义指针int a 10;//指针定义语法&#xff1a; 数据类型 * 指针变量名int * p;cout << "sizeof (int(*)) --> " << sizeof(p) << endl;//让指针记录变量a的地址 & 取址符p &a ;cout << &qu…

Git开发实战

本文对开发中git的常用概念和操作做一个总结。参考绿毛鸭子的部分内容。 git分布式的体现 1.本地完整的版本库&#xff1a; 每个克隆下来的 Git 仓库都包含了项目的所有历史记录、提交、分支等信息。这意味着每个开发者的本地仓库是一个完整的版本控制系统&#xff0c;包括…

ingress-nginx 开启 Prometheus 监控 + Grafana 查看指标

环境已经部署了 ingress-nginx&#xff08;DaemonSet 方式&#xff09;&#xff0c;并且 Prometheus Grafana 也已经运行。但之前 /metrics 端点没有暴露 Nginx 核心指标&#xff08;如 nginx_ingress_controller_requests_total&#xff09;&#xff0c;经过调整后现在可以正…

ThinkPHP 5.1 中的 error 和 success 方法详解

1、success() 方法 public function someAction() {// 操作成功逻辑...return $this->success(操作成功, 跳转地址, 额外数据); } 参数说明 参数类型说明默认值msgstring成功提示信息空字符串urlstring跳转URLnull (不跳转)datamixed返回的额外数据nullwaitinteger跳转等…

抗辐照MCU在卫星载荷电机控制器中的实践探索

摘要:在航天领域&#xff0c;卫星系统的可靠运行对电子元件的抗辐照性能提出了严苛要求。微控制单元&#xff08;MCU&#xff09;作为卫星载荷电机控制器的核心部件&#xff0c;其稳定性与可靠性直接关系到卫星任务的成败。本文聚焦抗辐照MCU在卫星载荷电机控制器中的应用实践&…

计算机视觉——相机标定

计算机视觉——相机标定 一、像素坐标系、图像坐标系、相机坐标系、世界坐标系二、坐标系变换图像坐标系 → 像素坐标系相机坐标系 → 图像坐标系世界坐标系 → 相机坐标系 ⋆ \star ⋆ 世界坐标系 → 像素坐标系 三、相机标定 一、像素坐标系、图像坐标系、相机坐标系、世界坐…

好未来0520上机考试题1:括号的最大嵌入深度

题目 &#xff08;LeetCode 1614.括号的最大嵌入深度&#xff09; 给定 有效括号字符串 s&#xff0c;返回 s 的嵌套深度。嵌套深度是嵌套括号的最大数量。 示例 1&#xff1a; 输入&#xff1a;s "(1(2*3)((8)/4))1" 输出&#xff1a;3 解释&#xff1a;数字…

MySQL复杂SQL(多表联查/子查询)详细讲解

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 MySQL复杂SQL&#xff08;多表联查/子查询&a…

Spring中循环依赖问题的解决机制总结

一、解决机制 1. 什么是循环依赖 循环依赖是指两个或多个Bean之间相互依赖对方&#xff0c;形成一个闭环的依赖关系。最常见的情况是当Bean A依赖Bean B&#xff0c;而Bean B又依赖Bean A时&#xff0c;就形成了循环依赖。在Spring容器初始化过程中&#xff0c;如果不加以特殊…

集运维_安装linux,麒麟等系统_步骤

u盘工具选择Ventoy,Rufus 在选择Ventoy和Rufus这两款U盘启动盘制作工具时,需根据具体需求权衡其优缺点: ‌核心差异‌ ‌多系统支持‌: ‌Ventoy‌:支持将多个ISO、WIM、IMG等类型的镜像文件直接复制到U盘,实现‌一盘多用‌(例如同时存放Windows、Linux等镜像),无需…

第4章:Cypher查询语言基础

Cypher是Neo4j的声明式图查询语言&#xff0c;专为处理图数据而设计。它允许用户以直观、高效的方式查询和修改图数据库中的数据。本章将介绍Cypher的基本概念和语法&#xff0c;帮助读者掌握使用Cypher进行基础图数据操作的能力。 4.1 Cypher语言概述 Cypher是Neo4j的主要查…

上位机知识篇---Flask框架实现Web服务

本文将简单介绍Web 服务与前端显示部分,它们基于Flask 框架和HTML/CSS/JavaScript实现,主要负责将实时视频流和检测结果通过网页展示,并提供交互式状态监控。以下是详细技术解析: 一、Flask Web 服务架构 1. 核心路由设计 @app.route(/) def index():"""…

Neovim - 打造一款属于自己的编辑器(一)

文章目录 前言&#xff08;劝退&#xff09;neovim 安装neovim 配置配置文件位置第一个 hello world 代码拆分 neovim 配置正式配置 neovim基础配置自定义键位Lazy 插件管理器配置tokyonight 插件配置BufferLine 插件配置自动补全括号 / 引号 插件配置 前言&#xff08;劝退&am…

按字典序排列最小的等效字符串

文章目录 题目思路解题过程Python代码C代码复杂度 题目 给出长度相同的两个字符串s1 和 s2 &#xff0c;还有一个字符串 baseStr 。 其中 s1[i] 和 s2[i] 是一组等价字符。 举个例子&#xff0c;如果 s1 “abc” 且 s2 “cde”&#xff0c;那么就有 ‘a’ ‘c’, ‘b’ ‘…

Ubuntu2404 下搭建 Zephyr 开发环境

1. 系统要求 操作系统&#xff1a;Ubuntu2404&#xff08;64位&#xff09;磁盘空间&#xff1a;至少 8GB 可用空间&#xff08;Zephyr 及其工具链较大&#xff09; 2. 安装必要工具 Tool Min. Version CMake 3.20.5 Python 3.10 Devicetree compiler 1.4.6 2.1 安装系…

2025年06月07日Github流行趋势

项目名称&#xff1a;netbird 项目地址url&#xff1a;https://github.com/netbirdio/netbird项目语言&#xff1a;Go历史star数&#xff1a;14824今日star数&#xff1a;320项目维护者&#xff1a;mlsmaycon, braginini, pascal-fischer, lixmal, pappz项目简介&#xff1a;使…

fast-reid部署

配置设置&#xff1a; 官方库链接&#xff1a; https://github.com/JDAI-CV/fast-reid# git clone https://github.com/JDAI-CV/fast-reid.git 安装依赖&#xff1a; pip install -r docs/requirements.txt 编译&#xff1a;切换到fastreid/evaluation/rank_cylib目录下&a…

clickhouse 和 influxdb 选型

以下是 ClickHouse、InfluxDB 和 HBase 在体系架构、存储引擎、数据类型、性能及场景的详细对比分析: 🏗️ ‌一、体系架构对比‌ ‌维度‌‌ClickHouse‌‌InfluxDB‌‌HBase‌‌设计目标‌大规模OLAP分析,高吞吐复杂查询 时序数据采集与监控,优化时间线管理高吞吐随机…