来源:牛客网
题目描述
给定字符串s,s只包含小写字母,请求出字典序最大的子序列。
子序列:https://en.wikipedia.org/wiki/Subsequence
字典序:https://en.wikipedia.org/wiki/Lexicographical_order
子序列:https://en.wikipedia.org/wiki/Subsequence
字典序:https://en.wikipedia.org/wiki/Lexicographical_order
输入描述:
一行一个字符串s (1 <= |s| <= 100,000)。
输出描述:
字典序最大的子序列。
示例1
输入
ababba
输出
bbba
示例2
输入
abbcbccacbbcbaaba
输出
cccccbba
题解:从左往右扫一遍找到第一个最大的字母。从后往前扫,如果前面的字母大于等于后边串中最大的字母,那么保存下来,最后逆序输出即可。
#include<bits/stdc++.h> using namespace std; char a[1000005]; int vis[1000005]; char ans[1000005]; int main() { while(~scanf("%s",a)) { int lena=strlen(a); memset(vis,0,sizeof(vis)); int maxn=-0x3f3f3f3f; int pos; for(int i=0;i<lena;i++) { vis[i]=a[i]-'0'; if(vis[i]>maxn) { maxn=vis[i];//从左往右找到最大字母第一次出现的位置 pos=i; } } int j=0; int maxn2=-0x3f3f3f3f; for(int i=lena-1;i>=pos;i--) { if(vis[i]>=maxn2) { ans[j++]=a[i]; maxn2=vis[i]; } } ans[j]=' '; for(int i=j-1;i>=0;i--) { printf("%c",ans[i]); } printf(" "); } }