题目地址:https://ac.nowcoder.com/acm/contest/551/D

题目描述


CSL 以前不会字符串算法,经过一年的训练,他还是不会……于是他打算向你求助。
给定一个字符串,只含有可打印字符,通过删除若干字符得到新字符串,新字符串必须满足两个条件:

  • 原字符串中出现的字符,新字符串也必须包含。
  • 新字符串中所有的字符均不相同。
  • 新字符串的字典序是满足上面两个条件的最小的字符串。

输入描述:

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

|s|≤105|s|≤105

输出描述:

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

示例1

输入

bab

输出

ab

示例2

输入

baca

输出

bac

备注:

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

解题思路:


若只考虑字符x 右边的 字符y的字典序是否比x的小来决策是否删除x,那么当删掉一个后又要重新考虑真个串,没有办法做,要转换思路。

因为要求字典序最小,所以每次遍历的时候都要从0x21 - 0x7E(33~127)一次遍历寻找可以作为结果的字符。(以这个为基础才保证了后面想法的正确性!)

last[]记录字符最后一次出现的位置,vis[]出现标注数组,ans[]标记字符是否已经作为答案,st为在字符串中寻找某个字符时的起始位置。

len记录字符串中出现不同字符的数目=答案的长度

第一层循环len次,每次都找出一个符合条件的字母作为答案。

第二层循环遍历[33,127],对于一个满足vis[x]=1&&ans[x]=0的字符x,寻找它在指定范围内出现的位置i,

第三层循环遍历[33,127],如果这个位置i之前存在最后出现的字符j(ans[j]=0)即last[j]<i则暂时不能把x作为结果。否则遍历完之后都没有找到ans[j]=0&&last[j]<i的,则说明i前面的字符都在i后面出现了或者i前面的字符(即使它的字典序比x小)都已经做了答案,且x的字典序是目前最小的,即把x作为答案,st=i+1,i(包括i)前面的字符都不用再考虑了。

举例:

i 0 1 2 3 4 5 6 7 8 9 10 11 12
s[i] c b c a c b e f e a c b c
last[s[i]]                

把s[3]换成e试试看。手动模拟一下即可。

ac代码:


#include <iostream>
#include <algorithm>
#include <string.h>
#include <ctype.h>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <sstream>
#define  maxn 200//33~127
using namespace std;
typedef long long ll;
int vis[maxn]={0},ans[maxn]={0},last[maxn],len=0,st=0;
string s,res;
bool ok(int x)
{int t;for(t=st;t<s.length();t++)if(s[t]==(char)x)break;for(int j=33;j<=127;j++)if(vis[j]&&!ans[j]&&last[j]<t)return false;//在x之前出现了最后一次出现的字符,则暂时不将x作为答案st=t+1;//下次遍历从保留字母位置的下一个开始return true;//若x之前出现了last[j]>i的,又因为x的字典序是由贪心来的最小,所以i之前重复的字母都可删掉只保留x
}
char geta()
{int i;for(i=33;i<=127;i++)if(vis[i]&&!ans[i]&&ok(i))//出现过且答案中没有出现,且可以作为答案{ans[i]=1;break;}return char(i);
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);memset(last,-1,sizeof(last));cin>>s;//len=(int)s.length();for(int i=0;i<s.length();i++){if(!vis[s[i]]){len++;vis[s[i]]=1;}last[s[i]]=i;}for(int i=0;i<len;i++)res+=geta();cout<<res<<endl;return 0;
}

【“新智认知”杯上海大学联赛】D-CSL的字符串(贪心)相关推荐

  1. “新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛 B.CSL 的英语考试

    CSL 的英语考试 CSL 为了备战即将到来的六级考试,在外面报了一个英语培训班.经过了一学期的学习后,英语老师决定要对 CSL 的学习成果进行检测.老师准备了一份卷子,考虑到 CSL 的英语水平,卷 ...

  2. “新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛----G-CSL的训练计划

    首先发出题目链接: 链接:https://ac.nowcoder.com/acm/contest/551/F 来源:牛客网 涉及:有向图 题目如下: 题目意思(表示我太chun,读了几遍才勉强明白了题 ...

  3. 智源杯天文数据算法挑战赛开赛,前沿AI技术助力天文科学研究

    由北京智源人工智能研究院主办,国家天文台.数据评测平台biendata联合举办的天体分类数据竞赛于2020年1月开赛.本次比赛旨在鼓励大众参与到天文学的探索当中,利用最新的人工智能算法分析望远镜收集到 ...

  4. 蓝驰创投朱天宇:用10年尺度看 AI 创业,如何发现独角兽 | 新智元专访

    2017年1月20日,新智元百人会闭门论坛,蓝驰创投管理合伙人朱天宇从投资人的角度,带来<用10年的尺度看AI 创业,对下一个创新周期思考>的主题分享. 在分享开始前,朱天宇拿出了一本&l ...

  5. 中国AI行业走向:新人胜旧人还是 BAT 牢牢掌握价值链顶端? | 新智元投资领袖论坛...

    2017年3月27日,在新智元开源·技术峰会的AI 投资领袖论坛,在北京大学人工智能创新中心主任雷鸣的支持下,红杉资本中国基金合伙人计越:高瓴资本集团合伙人洪婧:蓝驰创投管理合伙人朱天宇:中科招商集团 ...

  6. 新智元【Yoshua Bengio 亲自解答】机器学习 81 个问题及答案(最全收录)

    原文地址:http://valser.org/thread-828-1-1.html 新智元编译1 来源:Quora 译者:张巨岩  王婉婷  李宏菲  戴秋池 这是 Quora 的最新节目,针对特定 ...

  7. 徐立:1200层神经网络夺冠ImageNet,深度学习越深越好?| 新智元 AI 领军人物专访...

    人工智能领域的创业浪潮中,计算机视觉技术(CV)可以说是一个较为火热的方向,呈遍地开花之势.在这片江湖中,有四家公司特别突出,有 CV 领域的"一桶筐汤" 之称,可以看成是具有巨大 ...

  8. 第八届育才杯机器人比赛_疫情防控常态化,传统赛事新转型 “育才杯”第九届青岛国际象棋学校锦标赛(网络)顺利举办...

    原标题:疫情防控常态化,传统赛事新转型 "育才杯"第九届青岛国际象棋学校锦标赛(网络)顺利举办 "育才杯"青岛市国际象棋学校锦标赛是一项传统赛事,去年举办了第八 ...

  9. DeepMind哈萨比斯对话哈里王子:2018年AI最大的突破在生物或化学 2017-12-29 新智元 新智元报道 编辑:刘小芹 胡祥杰 【新智元导读】BBC 电台第四台连续第14年在

    DeepMind哈萨比斯对话哈里王子:2018年AI最大的突破在生物或化学 2017-12-29新智元 新智元报道 编辑:刘小芹  胡祥杰 [新智元导读]BBC 电台第四台连续第14年在圣诞和新年之间 ...

  10. 【深度学习看手相】台湾学生获奖 AI 项目是科学还是伪科学? 搜狐科技 08-06 12:44 1新智元报道 来源: medium,facebook 编译:胡祥杰 张易 【新智元导读】本周日带来一个有

    [深度学习看手相]台湾学生获奖 AI 项目是科学还是伪科学? 搜狐科技 08-06 12:44 1新智元报道 来源: medium,facebook 编译:胡祥杰 张易 [新智元导读]本周日带来一个有 ...

最新文章

  1. php yield 导出文件,PHP yield 读取大文件
  2. 身为Java程序员,这些开源工具你一定要学会!
  3. Qt QPushButton圆形图片设置为背景
  4. 用nginx做了一下反向代理,得到的ip地址都是127.0.0.1
  5. 移植mysql到嵌入式ARM平台
  6. 从没想过会有一个这样的机会|大疆招聘
  7. GPRS管理与创建APN拨号连接
  8. mysql迁移数据目录,这个坑你遇到过吗?
  9. NProxy——Mac和Linux平台下的Fiddler
  10. fer2013表情数据集
  11. chirp信号频谱(三角波和锯齿波)
  12. ThinkPHP商城分类无限分类遍历数据
  13. css通过行内样式绑定背景图片
  14. OC dyld750调用分析
  15. 杰理之ifi_camera跑sfc的启动时间【篇】
  16. 使用AccessibilityService(无障碍服务)自动完成手机设置功能
  17. 抖音一姐直播笑唱国歌被封,网友:早就该封了!
  18. 开放平台–扫描微信二维码登录
  19. Win10双屏显示设置教程
  20. 单片机开发无线控制系列-单片机端代码实现

热门文章

  1. 关于PC机相关系统的远程桌面协作的相关介绍和配置(转帖整理)
  2. 《MySQL必知必会》学习笔记——第五章(排序检索数据)
  3. Linux 找不到qt,linux – CMake找不到QtCore
  4. ARM开发7.5.2 基础实训( 6 ) 4×4 矩阵键盘和 2 路 LED 显示系统( 2 )--LPC21XX
  5. 小程序 ---- (获取手机号码)
  6. python 拟合分布_如何使用python将weibull分布拟合到数据?
  7. 【转】java中的Map集合
  8. 处理非window设置为window的Owner
  9. Wordvec_句子相似度
  10. 第34届越秀区青少年科技创新大赛_创客集结号上报名已开始啦