51nod 1255 字典序最小的子序列【贪心】
来源:互联网 发布:js性能优化 编辑:程序博客网 时间:2024/04/29 16:41
1255 字典序最小的子序列
题目来源: 天津大学OJ
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件:
1、包含字符串中所有出现过的字符各1个。
2、是所有满足条件1的串中,字典序最小的。
例如:babbdcc,出现过的字符为:abcd,而包含abcd的所有子序列中,字典序最小的为abdc。
Input
输入1行字符串S,所有字符均为小写,字符串的长度为L。(1 <= L <= 100000)。
Output
输出包含S中所有出现过的字符,每个字符各1个,并且字典序最小的S的子序列。
Input示例
babbdcc
Output示例
abdc
思路:
1、我们创建一个栈,用来存放解。
对于这个字符串,我们从第一个字符开始扫:
①如果这个栈此时为空,那么将这个字符丢进去。
②如果栈此时不为空,而且当前这个字符已经在栈中,跳过。
③如果栈此时不为空,而且当前这个字符不在栈中,我们分两种情况讨论:1.如果这个字符比栈顶大,那么直接丢到栈顶即可。2.如果这个比栈顶小,那么我们判断此时栈顶在这个字符后边还是否存在。如果后边还有,那么对应将栈顶弹出,直到不能弹出为止,再将这个字符丢到栈顶。
这样我们就能做到尽可能的贪心。
2、考虑到我们如果O(n^2)判断当前字符后边是否还存在这个字符,是很容易TLE的。所以我们O(n)维护当前这个字符在字符串中是第几次出现的,如果是最后一次,那么显然这个字符后边就不再存在了。这个方法还是很好实现的。
3、过程中细节较多,我们注意千万要维护好每个字符后边是否还存在这个字符这个条件。最后将所有字符弹出栈,逆序输出。
Ac代码:
#include<stdio.h>#include<string.h>#include<stack>using namespace std;char a[100060];char ans[300];int use[300];int have[300];int num[100060];int contz[300];int main(){ while(~scanf("%s",a)) { int n=strlen(a); memset(contz,0,sizeof(contz)); memset(num,0,sizeof(num)); memset(use,0,sizeof(use)); for(int i=0;i<256;i++)have[i]=1; for(int i=0;i<n;i++) { contz[a[i]]++; num[i]=contz[a[i]]; } stack<char >s; for(int i=0;i<n;i++) { if(s.size()==0) { s.push(a[i]); use[a[i]]=1; if(num[i]==contz[a[i]])have[a[i]]=0; } else { if(use[a[i]]==1) { if(num[i]==contz[a[i]])have[a[i]]=0; continue; } else if(a[i]<s.top()) { while(!s.empty()) { if(a[i]<s.top()&&have[s.top()]==1) { use[s.top()]=0; s.pop(); } else break; } } s.push(a[i]); use[a[i]]=1; if(num[i]==contz[a[i]])have[a[i]]=0; } } int cont=0; while(!s.empty()) { ans[cont++]=s.top(); s.pop(); } for(int i=cont-1;i>=0;i--) { printf("%c",ans[i]); } printf("\n"); }}
0 0
- 51nod 1255 字典序最小的子序列【贪心】
- 51nod 1255 字典序最小的子序列 []【贪心】
- 51NOD 1255 字典序最小的子序列 【贪心】
- 51nod 1255 字典序最小的子序列(贪心)
- 51nod 1255 字典序最小的子序列(贪心)
- 51nod 1255 字典序最小的子序列 贪心
- 51nod -1255 字典序最小的子序列(贪心)
- 51 nod 1255 字典序最小的子序列(单调栈 贪心)
- 51nod 1255 字典序最小的子序列
- 51nod-1255 字典序最小的子序列
- 51nod 1255 字典序最小的子序列
- 【51Nod 1255】字典序最小的子序列
- 51 nod 1255 字典序最小的子序列
- 51 nod 1255 字典序最小的子序列
- 51nod 1255 字典序最小的子序列 神奇的栈用法
- 51Nod-1255-字典序最小的子序列
- 1255 字典序最小的子序列
- 字典序最小的子序列
- Mariad函数(一)
- mysql5.7.*修改root默认密码
- 2017.1.18
- Android框架中常用的反射与注解
- HttpClient总结
- 51nod 1255 字典序最小的子序列【贪心】
- 分析 OVS 如何实现 vlan 隔离 - 每天5分钟玩转 OpenStack(140)
- 摄像头模组 PDAF对焦(Phase Detection Auto Focus)
- [NOI2014魔法森林]LCT
- [Codeforces 543A] Writing Code (完全背包DP)
- Latex tabular和tabular* 注意表格样式参数命令
- pat-bl-1024
- 查询jvm可配置的参数
- 路漫漫其修远兮,吾将上下而求索