51nod 1255 字典最小的子序列问题

14 篇文章 0 订阅
13 篇文章 0 订阅

1255 字典序最小的子序列 

题目来源: 天津大学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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值