(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)

题目:2434. 使用机器人打印字典序最小的字符串



思路:贪心+栈,时间复杂度0(n)。
字符串t其实就是栈,后进先出。要让p的字典序最小,那当然是t每次弹出的字符,都小于或等于"剩下未入t里的字符串的字符",细节看注释。

C++版本:

cpp 复制代码
class Solution {
public:
    string robotWithString(string s) {
        int n=s.size();
        //预处理出后半段的最小字符
        vector<char> v(n+1);
        v[n]='z';
        for(int i=n-1;i>=0;i--){
            v[i]=min(v[i+1],s[i]);
        }
        // 答案
        string t="";
        // 栈,模拟t
        stack<char> st;
        // 遍历字符串s
        for(int i=0;i<n;i++){
        	// 当前字符入栈
            st.push(s[i]);
            // 当栈不为空,且栈顶字符<=后半段字符串s[i+1,n)中的所有字符
            while(st.size()>0 && st.top()<=v[i+1]){
            	// 出栈
                t.push_back(st.top());
                st.pop();
            }
        }
        return t;
    }
};

JAVA版本:

java 复制代码
class Solution {
    public String robotWithString(String s) {
        int n=s.length();
        char[] v=new char[n+1];
        v[n]='z';
        for(int i=n-1;i>=0;i--){
            v[i]=(char)Math.min(v[i+1],s.charAt(i));
        }
        StringBuilder ans=new StringBuilder();
        Deque<Character> st=new ArrayDeque<>();
        for(int i=0;i<n;i++){
            st.push(s.charAt(i));
            while(!st.isEmpty() && st.peek()<=v[i+1]){
                ans.append(st.pop());
            }
        }
        return ans.toString();
    }
}

Go版本:

go 复制代码
func robotWithString(s string) string {
    n:=len(s)
    v:=make([]byte,n+1)
    v[n]=byte('z')
    for i:=n-1;i>=0;i-- {
        v[i]=min(v[i+1],s[i]);
    }
    ans:=make([]byte,0,n)
    st:=make([]byte,n)
    top:=-1
    for i:=0;i<n;i++ {
        top++
        st[top]=s[i]
        for top>=0 && st[top]<=v[i+1] {
            ans=append(ans,st[top])
            top--
        }
    }
    return string(ans)
}
相关推荐
青云交20 分钟前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
艾莉丝努力练剑38 分钟前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_021 小时前
【Java基础面试题】Java基础概念
java·开发语言
二十雨辰1 小时前
[TG开发]照片机器人
java·web3
武昌库里写JAVA2 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
C++、Java和Python的菜鸟2 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀2 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1122 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧3 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
落霞的思绪3 小时前
Java设计模式详细解读
java·开发语言·设计模式