# 316_Remove_Duplicate_Letters ###### tags: `leetcode` ## Problem Statement Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results. - Note: This question is the same as 1081: https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/ - Example 1: > Input: s = "bcabc" > Output: "abc" - Example 2: > Input: s = "cbacdcbc" > Output: "acdb" - Constraints: > $$1 <= s.length <= 10^4$$ > s consists of lowercase English letters. ## Solution - To begin with, remember the last element that appear in the string ```cpp= int i= 0; for (; i< s.length(); i++) { app[s[i]- 'a']= i; } ``` - Use the ```set``` to remember whether the character is used. If positive, compare whether it is needed to replace its original position. - The condition to remove the last element in the answer is like below: - There are elements in the answer. - The element to be added is smaller than the last element now. - The last element has other index that is bigger than the current used one. ```cpp= if (!seen.count(c)) { while (!ans.empty()&& c< ans.back()&& app[ans.back()- 'a']> i) { seen.erase(ans.back()); ans.pop_back(); } ans+= c; seen.emplace(c); } ``` - After the adjustment, add the element in the position.