链接:https://ac.nowcoder.com/acm/contest/551/D
来源:牛客网
CSL 以前不会字符串算法,经过一年的训练,他还是不会……于是他打算向你求助。
给定一个字符串,只含有可打印字符,通过删除若干字符得到新字符串,新字符串必须满足两个条件:
仅一行,有一个只含有可打印字符的字符串 s。 |s|≤105
bab
ab
baca
bac
删除若干字符,新字符串中仅包含一个原字符串中字母,并且字典序要最小。
关注到底需要记录什么,只需要记最后一次出现的位置即可。前面的可删去。
#include
using namespace std;
typedef long long ll;
map m,mm;//一个用于记录最后位置 一个用于标记是否出现了
stack ss;//用于放置新字符
int main()
{
string s;
cin>>s;
for(int i=0; s[i]; i++)
m[s[i]]=i;
for(int i=0; s[i]; i++)
{
if(mm[s[i]]==0)
{
while(!ss.empty()&&ss.top()>s[i]&&m[ss.top()]>i)//一定记得判空
{
mm[ss.top()]=0;
ss.pop();
}
ss.push(s[i]);
mm[s[i]]=1;
}
}
s.clear();
while(!ss.empty())//输出字符串
{
s+=ss.top();
ss.pop();
}
reverse(s.begin(),s.end());//字符串逆转直接用reverse
cout<