Maximize the Remaining String

cf题目链接
题意:给你一个字符串,问对所有重复字符删除至只剩一个后得到的字典序最大的字符串是什么

解析:简单的模拟,要使字典序最大,那么我们就要使前面的字符最大,要使大字符提前,那我们就需要尽量删去大字符之前的小字符,但删除小字符并不是随意删除,而是有条件的,如果整个字符串该小字符只出现了一次,显然不能删除,如果该字符重复出现呢,这时有三种情况:①前面选用了此小字符,那么此字符是必须删除的②前面没有使用此小字符,但此小字符是最后一次出现,这是我们也不能删除(重复字符需要留下一个)③非①②的情况,此时自然是可以删除了,为保证最终字典序最大,使大字符尽可能提前出现。

AcCode

#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<cstring>

#define int long long

using namespace std;

const int N = 3e5 + 100;
bool canChang[N];//能否通过此字符改变字典序

signed main() {
    int t;
    cin >> t;
    while (t--) {
        string str;
        string output;
        cin >> str;
        map<char, int> vis;
        for (int pos = 0; pos < str.length(); pos++) vis[str[pos]] = pos, canChang[str[pos]] = true;
        for (int pos = 0; pos < str.length(); pos++) {
            if (!canChang[str[pos]]) continue;
            while (!output.empty() && output.back() < str[pos] && vis[output.back()] > pos) {
                canChang[output.back()] = true;
                output.pop_back();
            }
            output.push_back(str[pos]);
            canChang[str[pos]] = false;
        }
        cout << output << endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值