51nod 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


- - 不会的话先看数据结构书上的逆波兰式 。

这个也是用到了优先级 。

优先小的放在前面

每次的新的值 和栈顶的比  如果栈顶的值比较大 并且栈顶的值在后面还有出现的话 就出栈 直到最后

如果这个值在栈里 或者这个值在后面不出现了的话 就停止循环


优先级的栈的用法

下面代码是模拟栈  , 先模拟栈,再用stl的栈。。别直接用栈。。不好改。

微调- - 

#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <string>
#include<iostream>
#include<algorithm>
#include<cstring>
#include <cstdio>
#include <map>
using namespace std;
char b[100005];//模拟栈
map<char ,int >d;//用来记录字符出现的次数
map<char ,int >p;//用来标记栈里是否出现过字符

int main()
{
    string a;
    while(cin>>a)
    {
        int l=strlen(&a[0]);
        for(int i=0;i<l;i++)
        {
            d[a[i]]++;
            p[a[i]]=1;
        }
        char x='~';//此处为代码微调。和manacher的前缀一样。。具体的  , 我只是调的能ac了,具体我也不知道为啥。
        d[x]=100;
        p[x]=1;
        int j=0;
        b[j]='~';
        for(int i=0;i<l;i++)
        {
            //cout<<p[a[i]]<<' '<<a[i]<<' '<<d[a[i]]<<endl;
            while(a[i]<b[j]&&d[b[j]]>0&&p[b[j]]==0&&p[a[i]]==1)//判定就是,把最小的放在前面,然后 出栈
            {
                p[b[j]]=1;
                b[j]='~';
                j--;
            }
            //cout<<j<<endl;
            if(j<0) j=0;
            if(a[i]!=b[j]&&p[a[i]])
            {

                p[a[i]]=0;
                j++;
                b[j]=a[i];
            }d[a[i]]--;//每次的把字符数量减去1
            //cout<<b<<endl;

        }
        for(int i=1;b[i];i++)
            cout<<b[i];
        cout<<endl;
    }
}








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值