zoukankan      html  css  js  c++  java
  • 797C C. Minimal string

    贪心,后缀

    思路:

    逆序维护一个数组minn【i】=x,表示第i个位子后边最小的字符是x.

    那么对应维护一个栈,如果此时栈顶字符小于等于minn【此时要加入的元素的位子】,那么就出栈,将栈顶这个字符输出;

    同时每个字符都在操作结束后入栈。

    来源https://blog.csdn.net/mengxiang000000/article/details/70210727

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<queue>
    #include<map>
    #include<unordered_map>
    #include<stack>
    #define DEBUG(x) cout<<#x<<" = "<<x<<endl
    using namespace std;
    const int MAXN=1e5+10;
    char in[MAXN];
    char mn[MAXN];///从len-1到i为止最小的字符
    map<char,int >mp;
    int main()
    {
    //    freopen("in.txt","r",stdin);
        stack<char>stk;
        scanf("%s",in);
        int l=strlen(in);
        for(int i=l-1;i>=0;i--){
            if(i==l-1)mn[i]=in[i];
            else mn[i]=min(mn[i+1],in[i]);
        }
        for(int i=0;in[i]!='';i++){
    ///        stk.push(in[i]);
    ///如果放在这里,并且当前字符小于等于mn[i],就会导致
    ///先输出当前字符,而此时栈中可能有更小的字符
            while(!stk.empty()){
                if(stk.top()<=mn[i]){
                    printf("%c",stk.top());
                    stk.pop();
                }
                else break;
            }
            ///为什么要放在后面?
            stk.push(in[i]);
        }
        while(!stk.empty()){
            printf("%c",stk.top());
            stk.pop();
        }
    }
  • 相关阅读:
    LabelImg 图像图像标注工具
    周杰伦的2000w个故事
    ROS 订阅图像节点(1)
    ROS 订阅图像节点
    ROS 双目标定
    书籍
    Z30云台PC控制问题
    大疆M600组装和试飞
    M100 X3云台安装
    M100 组装教程
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9975408.html
Copyright © 2011-2022 走看看