题目来源: 天津大学OJ
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件:
1、包含字符串中所有出现过的字符各1个。
2、是所有满足条件1的串中,字典序最小的。
例如:babbdcc,出现过的字符为:abcd,而包含abcd的所有子序列中,字典序最小的为abdc。
Input
输入1行字符串S,所有字符均为小写,字符串的长度为L。(1 <= L <= 100000)。
Output
输出包含S中所有出现过的字符,每个字符各1个,并且字典序最小的S的子序列。
Input示例
babbdcc
Output示例
abdc
用栈维护一下,保证他是最小的否则的话弹出栈
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
char s[100050];
int num[30];
stack<char>S;
int vist[30];
char ans[30];
int main()
{
cin>>s;
memset(num,0,sizeof(num));
memset(vist,0,sizeof(vist));
int len=strlen(s);
for(int i=0;i<len;i++)
{
num[s[i]-'a']++;
}
S.push(s[0]);
vist[s[0]-'a']=1;
num[s[0]-'a']--;
for(int i=1;i<len;i++)
{
num[s[i]-'a']--;
if(vist[s[i]-'a'])
continue;
while(!S.empty()&&S.top()>s[i]&&num[S.top()-'a']>0)
{
vist[S.top()-'a']=0;
S.pop();
}
S.push(s[i]);
vist[s[i]-'a']=1;
}
int qum=0;
while(!S.empty())
{
ans[qum++]=S.top();
S.pop();
}
for(int i=qum-1;i>=0;i--)
{
cout<<ans[i];
}
cout<<endl;
return 0;
}