力扣第314周赛第三题

题目:

给你一个字符串 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,然后求出剩余字符串中字典序最小的字符,如果栈顶元素是小于或等于最小字符(栈非空),则弹栈,不断循环,直到栈空或者栈顶元素大于剩余字符串中的最小字符,接着直到把这个最小字符入栈。由于遍历到最后没了剩余字符,到了最边界点,上述的弹栈循环一定可以将栈弹空。

class Solution {
public:
string robotWithString(string s) {
        string ans;
        int sum[26]={0};
        stack<char> ai;
        for(int i=0;i<s.size();++i)++sum[s[i]-'a'];
        for(int i=0;i<s.size();++i){
            int x=s[i]-'a';int m=0;
            sum[x]--;
             ai.push(s[i]);
            while(m<26&&sum[m]==0)m++;
            while(!ai.empty()&&ai.top()-'a'<=m){
                ans+=ai.top(),ai.pop();
            }
           

        }
        
        return ans;
    }
};

我的代码:

class Solution {
public:
    bool judge(int x,int *sum){
for(int i=0;i<x;++i){
if(sum[i]>0)return false;
}
        return true;
    }
    string robotWithString(string s) {
        stack<char> a;
        string b;
        int sum[26]={0};
        int flag=0;
        for(int i=0;i<s.size();++i)sum[s[i]-'a']++;
        for(int i=0;i<s.size();++i){
            if(i==(s.size()-1)&&s[i]=='z'){flag=1;continue;}
            sum[s[i]-'a']--;
        while(!a.empty()&&s[i]-a.top()>0&&judge(a.top()-'a',sum)){
        b+=a.top();a.pop();
        }
        a.push(s[i]);
            
        }
        while(!a.empty())b+=a.top(),a.pop();
        if(flag)b+='z';
        return b;
    }
};

之前就是当最后一个字符是z的时候有问题,最后是z的时候应该是最后一个输出,特殊考虑一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值