编写程序,删除输入的字符串中的重复字符,使得余下的字符串最小(按字符的字典排列比较规则),且余下的字符在原来字符串的相对位置保持不变。 说明:1)字符串中均为小写字母;2)字符串长度在9998以内。
输入样例1:
一个由小写字母组成的字符串:
bbcaac
输出样例1:
去除重复字符串后的最小的字符串:
bac
输入样例2:
一个由小写字母组成的字符串:
cbacdcbc
输出样例2:
去除重复字符串后的最小的字符串:
acdb
单调栈
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
string str;
cin >> str;
stack<char> stk;
vector<bool>instack(256, false);
vector<int>count(256, 0);
for(size_t i = 0; i < str.size(); i++){
count[str[i]]++;
}
for(int i = 0; i < str.size(); i++){
count[str[i]]--;
if(instack[str[i]])continue;
while(!stk.empty() && stk.top() > str[i]){
if(count[stk.top()] == 0)break;
instack[stk.top()] = false;
stk.pop();
}
stk.push(str[i]);
instack[str[i]] = true;
}
string restr;
while(!stk.empty()){
restr += stk.top();
stk.pop();
}
reverse(restr.begin(), restr.end());
cout << restr << endl;
return 0;
}