给你一个字符串 s
,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
输入:s = "bcabc"
输出:
"abc"
示例 2:
输入:s = "cbacdcbc"
输出:"acdb"
提示:
1 <= s.length <= 104
s
由小写英文字母组成
//20220928 新字符比栈顶小,栈顶字符在后面还有,删除栈顶字符
string removeDuplicateLetters(string s)
{
if (s.size() <= 0)
{
return "";
}
vector<bool>visited(26, false);
map<char, vector<int>> mulMap;
for (int i = 0; i < s.length(); i++)
{
if (mulMap.count(s[i]) > 0)
{
mulMap[s[i]].push_back(i);
}
else
{
mulMap[s[i]] = vector<int>{ i };
}
}
vector<char> vec;
vec.push_back(s[0]);
visited[s[0] - 97] = true;
int curIndex = 1;
for (int curIndex = 1; curIndex < s.length(); curIndex++)
{
if (visited[s[curIndex] - 97] == true)
{
continue;
}
while (vec.size() > 0 && vec.back() > s[curIndex] && mulMap[vec.back()].size()>1)
{
vector<int> charVec = mulMap[vec.back()];
bool find = false;
for (int j = 0; j < charVec.size(); j++)
{
if (charVec[j] > curIndex)
{
find = true;
break;
}
}
if (true == find)
{
visited[vec.back() - 97] = false;
vec.pop_back();
}
else
{
break;
}
}
vec.push_back(s[curIndex]);
visited[s[curIndex] - 97] = true;
}
string ret(vec.size(), '-1');
for (int i = 0; i < vec.size(); i++)
{
ret[i] = vec[i];
}
return ret;
}