CSL 的字符串(单调栈)
链接:https://ac.nowcoder.com/acm/contest/551/D
来源:牛客网
题目描述
CSL 以前不会字符串算法,经过一年的训练,他还是不会……于是他打算向你求助。
给定一个字符串,只含有可打印字符,通过删除若干字符得到新字符串,新字符串必须满足两个条件: 原字符串中出现的字符,新字符串也必须包含。 新字符串中所有的字符均不相同。 新字符串的字典序是满足上面两个条件的最小的字符串。
输入描述:
仅一行,有一个只含有可打印字符的字符串 s。
|s|≤105|s|≤105
输出描述:
在一行输出字典序最小的新字符串。
示例1
输入
bab
输出
ab
示例2
输入
baca
输出
复制
bac
备注:
ASCII字符集包含 94 个可打印字符(0x21 - 0x7E),不包含空格。
这个题好神奇,用栈的思想 (愚昧无知第一次见)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int vis[500],cnt[500],n,m,t;
string s;
while(cin>>s)
{
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
for(auto c:s)
cnt[c]++;
string s1;
for(auto c:s)
{
cnt[c]--;
if(!vis[c])
{
while(s1.size()&&cnt[s1.back()]&&c<s1.back())
{
vis[s1.back()]=0;
s1.pop_back();
}
s1.push_back(c);
vis[c]=1;
}
}
cout<<s1<<'\n';
}
return 0;
}