Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.
Example:
Given "bcabc"
Return "abc"
Given "cbacdcbc"
Return "acdb"
核心思想是处理当前字符c1的时候,检查之前的字符c2;如果当前字符c1小于之前的字符c2,并且c2在后面还有出现,则把c2从结果里去掉。如果满足条件则一直重复这个过程。可以通过统计字符出现的次数来检查c2是否在后面还有出现,当然也可以直接存最后一次出现的位置。
class Solution {
public:
string removeDuplicateLetters(string s) {
int counts[26] = {0};
for (char ch : s) {
++counts[ch - 'a'];
}
string result;
bool contained[26] = {false};
for (char ch : s) {
--counts[ch - 'a'];
if (!contained[ch - 'a']) {
while (!result.empty() && ch < result.back() && counts[result.back() - 'a'] > 0) {
contained[result.back() - 'a'] = false;
result.pop_back();
}
result.push_back(ch);
contained[ch - 'a'] = true;
}
}
return result;
}
};