牛客上海高校程序设计竞赛 D CSL 的字符串(思维)

链接:https://ac.nowcoder.com/acm/contest/551/D
来源:牛客网

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

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

输入描述:
仅一行,有一个只含有可打印字符的字符串 s。

|s|≤105
输出描述:
在一行输出字典序最小的新字符串。
示例1
输入
bab
输出
ab

示例2
输入
baca
输出
bac
备注:
ASCII字符集包含 94 个可打印字符(0x21 - 0x7E),不包含空格。
(思路:记录每个字符的个数,然后遍历字符串s,用一个字符串ans储存答案,随时更新。遍历字符串s时,如果该字符s[i]没在ans里面(保证ans中字符各不相同)、ans非空并且ans串的最后一个字符的个数不为0(即后面还有),则把最后一个字符pop掉(保证字典序最小),然后ans加上s[i],并标记s[i]。)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int cnt[150];
bool vis[150];
int main(void)
{
   string s,ans;
   cin>>s;
   for(int i=0;i<s.length();i++)
   {
   	  cnt[s[i]]++;
   }
   for(int i=0;i<s.length();i++)
   {
   	  cnt[s[i]]--;
   	  if(!vis[s[i]])
   	  {
	   	    while(ans.size()&&s[i]<ans.back()&&cnt[ans.back()])	
	   	  	{
	   	  	   vis[ans.back()]=0;
			   ans.pop_back();	
			}
	   	  	ans+=s[i];
	   	  	vis[s[i]]=1;
	  }
   }
   cout<<ans<<endl;
   return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值