给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:"bcabc"
输出:"abc"
示例 2:
输入:"cbacdcbc"
输出:"acdb"
思路:这道题与其余2道题的解答类似:
Create Maximum Number
Remove Duplicate Letters
Remove K Digits
都是维护一个递增序列,如果当前带插入字符c比栈顶元素的ascll码小,就弹出栈顶元素,否则压入栈。最后得到的一定是最小的元素,对于这道题有一些小细节要处理,一个是前导0要消除,一个是最后数字的个数要保证一定去掉k个元素。
参考代码:
class Solution {
public:
string removeKdigits(string num, int k) {
string res = "";
int n = k,cnt=0;
for (auto c : num) {
while (!res.empty() && n > 0 && c < res.back()) {
res.pop_back();
n--;
}
res.push_back(c);
}
while (res[cnt] == '0') cnt++;
res = res.substr(cnt, num.size() - k - cnt);
return res.empty() ? "0" : res;
}
};