zoukankan      html  css  js  c++  java
  • 上海高校程序设计竞赛 D CSL 的字符串 ( 贪心)

    题目描述

    CSL 以前不会字符串算法,经过一年的训练,他还是不会……于是他打算向你求助。

    给定一个字符串,只含有可打印字符,通过删除若干字符得到新字符串,新字符串必须满足两个条件:
    • 原字符串中出现的字符,新字符串也必须包含。
    • 新字符串中所有的字符均不相同。
    • 新字符串的字典序是满足上面两个条件的最小的字符串。
     

    输入描述:

    仅一行,有一个只含有可打印字符的字符串 s。
     
    |s|10^5

    输出描述:

    在一行输出字典序最小的新字符串。

    示例1

    输入

    bab

    输出

    ab

    示例2

    输入

    baca

    输出

    bac

    备注:

    ASCII字符集包含 94 个可打印字符(0x21 - 0x7E),不包含空格。

    对于字符串s,我们求出其每个字符最后出现的位置,用栈遍历s,对于第i个字符,如果栈顶字符大于这个字符并且栈顶字符最后出现的位置大于i就弹出栈顶字符并存入第i个字符,否则直接存入第i个字符,最后倒序输出栈内字符。

    现在考虑为什么:栈是要保存字典序最小的结果 , 如果这个字符在后面还是会出现的话 ,同时也不是最优的情况, 我们是可以删除的

    Orz 

    #include<bits/stdc++.h>
    using namespace std;
    int id[300];
    bool vis[300];
    stack<char>st;
    
    int main()
    {
        string str; cin>>str;
    
        for(int i=0 ; i<str.size() ; i++)
        {
            id[str[i]]=i;
        }
        st.push(str[0]);
        vis[str[0]]=1;
    
        for(int i=0 ; i<str.size() ; i++)
        {
            if(vis[str[i]]) continue;
    
            while(!st.empty() && st.top() > str[i] && id[st.top()] > i)
            {
                vis[st.top()]=0;
                st.pop();
            }
            st.push(str[i]);
            vis[str[i]]=1;
        }
        string ans;
        while(!st.empty())
        {
            ans+=st.top();
            st.pop();
        }
        for(int i=ans.size()-1 ; i>=0 ; i--)
        {
          cout<<ans[i];
        }
        puts("");
    }
    View Code
  • 相关阅读:
    小程序事件参数传递
    java.lang.ClassNotFoundException: javax.servlet.SessionCookieConfig
    SSM单元测试时出现:Failed to load ApplicationContext的一种可能解决办法
    Cannot resolve classpath entry: /Program Files/IBM/SQLLIB/java/db2java.zip
    python 批量重命名文件
    abp + vue 模板新建页面
    Git 新建版本库命令
    vi/vim 行删除操作
    abp angular 前端权限控制
    杨辉三角-python
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/10638347.html
Copyright © 2011-2022 走看看