316. Remove Duplicate Letters
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.
Example 1:
Input: s = "bcabc"
Output: "abc"
Example 2:
Input: s = "cbacdcbc"
Output: "acdb"
Constraints:
1 <= s.length <= 104
s
consists of lowercase English letters.
Note: This question is the same as 1081: https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/
Intuition
Approach:
We want increasing (lexographic distinct) String,
Thats where we think of the stack, Monotonic
Now, We make a note of all characters, Last appearing index in the map
Then we push the elements in stack,
When,
smaller element comes in stack , top > current
We have to pop, but we only pop only if that popping element is present at higher
index, otherwise not
Links
https://leetcode.com/problems/remove-duplicate-letters/description/
Video Links
Approach 1:
class Solution {
public:
string removeDuplicateLetters(string s) {
stack<char> st;
unordered_map<char,int> mp;
vector<bool> track(26,false);
for(int i=0; i<s.size(); i++)
mp[s[i]] = i;
string ans="";
for(int i=0; i<s.size(); i++){
if(track[s[i]-'a'] == true)
continue;
while(!st.empty() and st.top() > s[i] and i<mp[st.top()]){
track[st.top()-'a'] = false;
st.pop();
}
st.push(s[i]);
track[s[i]-'a'] = true;
}
while(!st.empty()){
ans += st.top();
st.pop();
}
reverse(ans.begin(), ans.end());
return ans;
}
};
Approach 2:
Approach 3:
Approach 4:
Similar Problems
Last updated