字典序最小的子序列 51Nod - 1255

本文介绍了一种使用单调栈解决算法问题的方法,具体为在给定字符串中寻找最美单词。通过记录每个字母的最早和最晚出现位置,利用单调栈进行优化选择,最终输出最美单词。代码实现详细展示了算法步骤,包括初始化、遍历字符、更新位置信息、栈操作及结果输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1255

记录每个字母出现的最早和最晚位置 然后扫一遍 维护一个单调栈 但是并不只考虑字母大小 还要考虑出现最早最晚位置 如果当前字母比栈顶元素小 并且栈顶元素在在之后还会出现 那就换掉这个栈顶

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int maxc=50;

stack <char> stk;
int l[maxc],r[maxc],book[maxc];
int n,len;
char ch[maxn],ans[maxc];

int main()
{
    int i;
    scanf("%s",ch);
    n=strlen(ch);
    memset(l,0x3f,sizeof(l));
    memset(r,-1,sizeof(r));
    for(i=0;i<n;i++)
    {
        l[ch[i]-'a']=min(l[ch[i]-'a'],i);
        r[ch[i]-'a']=max(r[ch[i]-'a'],i);
    }
    for(i=0;i<n;i++)
    {
        if(!book[ch[i]-'a'])
        {
            while(!stk.empty()&&stk.top()>ch[i]&&r[stk.top()-'a']>i)
            {
                book[stk.top()-'a']=0;
                stk.pop();
            }
            stk.push(ch[i]);
            book[ch[i]-'a']=1;
        }
    }
    len=stk.size();
    while(!stk.empty())
    {
        ans[--len]=stk.top();
        stk.pop();
    }

    printf("%s\n",ans);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值