【力扣】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(n2)

? 優化目標

  • 避免頻繁使用 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
繁體地址,請注明出處:http://hk.pswp.cn/news/908507.shtml
英文地址,請注明出處:http://en.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分析,高吞吐復雜查詢 時序數據采集與監控,優化時間線管理高吞吐隨機…