题目内容
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:s = “bcabc”
输出:“abc”
示例 2:
输入:s = “cbacdcbc”
输出:“acdb”
提示:
1 <= s.length <= 104
s 由小写英文字母组成
解题思路
今儿的题错了四次才过。
为了保证程序的正常运行,方法编写必须考虑所有可能发生的情况,这个事情不能讲大概。
详见代码。
解题代码
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int>ha(26);
vector<int> si(26);
stack<char> t;
for (int i = 0; i < s.size(); i++) { ha[s[i] - 'a']++; }
string ans; int i = 0;
while (i < s.size()) {
if (t.empty()) { t.push(s[i]); ha[s[i] - 'a']--; si[s[i] - 'a']++; }
else {
if (t.top() > s[i]) {
if (ha[t.top() - 'a'] > 0)
{
if (!si[s[i] - 'a'])
{
si[t.top() - 'a'] = 0; t.pop(); continue;
}
else
{
ha[s[i] - 'a']--;
}
}
else if (ha[t.top() - 'a'] <= 0)
{
if (!si[s[i] - 'a']) { t.push(s[i]); ha[s[i] - 'a']--; si[s[i] - 'a'] = 1; }
else
ha[s[i] - 'a']--;
}
}
else if (t.top() < s[i])
{
if (!(si[s[i] - 'a']))
{
t.push(s[i]); si[s[i] - 'a'] = 1; ha[s[i] - 'a']--;
}
else ha[s[i] - 'a']--;
}
else
{
ha[t.top() - 'a']--;
}
}
i++;
}
while (!empty(t))
{
ans.insert(ans.begin(), t.top());
t.pop();
}
return ans;
}
};