NC23992. 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; }