26- Remove Duplicate Letters
The problem can be found at the following link: Question Link
My Approach
Initialize two vectors:
freq: A vector of size 26 to keep track of the frequency of each lowercase letter in the input strings. Initialize all elements to 0.visited: A vector of size 26 to keep track of whether a character has been visited or not. Initialize all elements to 0.
Iterate through the characters of the input string
s:For each character
chins, increment the corresponding frequency in thefreqvector. This will count how many times each character appears in the string.
Initialize an empty string
ansto store the result.Get the length of the input string
sand store it in a variablen.Iterate through the characters of the input string
sagain using a loop fromi=0toi<n:Decrement the frequency of the current character
s[i]in thefreqvector.
Check if the current character
s[i]has not been visited yet (i.e.,visited[s[i]-'a']is 0):Enter a while loop that continues as long as the following conditions are met:
ansis not empty (ans.size()is non-zero).The last character in
ans(i.e.,ans.back()) is greater than the current characters[i].The frequency of the last character in
ansis greater than 0 (i.e.,freq[ans.back()-'a'] > 0).
Inside the while loop:
Mark the character as not visited by setting
visited[ans.back()-'a']to 0.Remove the last character from
ansby usingans.pop_back().
After exiting the while loop, append the current character
s[i]to theansstring to add it to the result.Mark the current character
s[i]as visited by settingvisited[s[i]-'a']to 1.Repeat steps 5-8 for all characters in the input string
s.Return the final
ansstring, which contains the unique characters from the input string in lexicographically smallest order while maintaining their relative order.
Time and Auxiliary Space Complexity
Time Complexity:
O(n)Auxiliary Space Complexity:
O(n)
Code (C++)
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int>freq(26,0), visited(26,0);
for(auto ch:s)freq[ch-'a']++;
string ans;
int n = s.length();
for(int i=0;i<n;i++){
freq[s[i]-'a']--;
if(!visited[s[i]-'a']){
while(ans.size() and ans.back()>s[i] and freq[ans.back()-'a']>0) {
visited[ans.back()-'a'] = 0;
ans.pop_back();
}
ans.push_back(s[i]);
visited[s[i]-'a'] = 1;
}
}
return ans;
}
};
Contribution and Support
For discussions, questions, or doubts related to this solution, please visit our discussion section. We welcome your input and aim to foster a collaborative learning environment.
If you find this solution helpful, consider supporting us by giving a ⭐ star to the rishabhv12/Daily-Leetcode-Solution repository.
Last updated
Was this helpful?