列表

详情


NC23992. CSL 的字符串

描述

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

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

输入描述

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


输出描述

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

示例1

输入:

bab

输出:

ab

示例2

输入:

baca

输出:

bac

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 7ms, 内存消耗: 612K, 提交时间: 2019-04-01 18:19:36

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;

int num[300];
int vis[300];
int main(){
	string s,ans="";
	cin>>s;
	for(int i:s)
		num[i]++;
	for(int i:s){
		num[i]--;
		if(vis[i])
			continue;
		while(ans.size()&&num[ans.back()]>0&&i<ans.back()){
			vis[ans.back()]=0;
			ans.pop_back();
		}
		ans+=i;
		vis[i]=1;
		
	}
	cout<<ans<<endl;
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 94ms, 内存消耗: 8344K, 提交时间: 2019-04-10 14:15:34

s = input()[::-1]
n = len(s)
l = []
mask = 0
for i in range(n):
	mask |= 2**(ord(s[i])-0x21)
	l.append(mask)
l.reverse()
s = s[::-1]
r = []

index = 0
while mask > 0:
	for i in range(94):
		b = 2**i
		if (mask & b) != 0:
			index2 = s.find(chr(i+0x21), index, n)
			if (l[index2] & mask) == mask:
				index = index2
				mask ^= b
				r.append(chr(i+0x21))
				break

print(''.join(r))

pypy3(pypy3.6.1) 解法, 执行用时: 90ms, 内存消耗: 20700K, 提交时间: 2020-04-17 20:40:40

str1=input()
dica={}
dicb={}
for i in str1:
    dica[i]=dica.get(i,0)+1
    dicb[i] = dicb.get(i, 0)
res=[]
for word in str1:
    dica[word]=dica[word]-1
    if dicb[word]==0:
        while len(res)>0 and dica[res[-1]]!=0 and word < res[-1]:
            dicb[res[-1]]=0
            res.pop()
        res.append(word)
        dicb[word]=1
str2="".join(str(i) for i in res)
print(str2)

C++11(clang++ 3.9) 解法, 执行用时: 16ms, 内存消耗: 740K, 提交时间: 2020-03-18 13:12:28

#include<bits/stdc++.h>
using namespace std;
int main()
{
	map<char,int> cnt;
	string s,t;
	set<char> vis;
	cin>>s;
	for(auto &i:s) cnt[i]++;
	for(auto &i:s)
	{
		if(!vis.count(i))
		{
			while(!t.empty()&&t.back()>i&&cnt[t.back()]>0) vis.erase(vis.find(t.back())),t.pop_back();
			t+=i;
			vis.insert(i);
		}
		cnt[i]--;
	}
	cout<<t<<"\n";
	return 0;
}  

上一题