Return the lexicographically smallest subsequence of text
that contains all the distinct characters of text
exactly once.
Example 1:
Input: "cdadabcc" Output: "adbc"
Example 2:
Input: "abcd" Output: "abcd"
Example 3:
Input: "ecbacba" Output: "eacb"
Example 4:
Input: "leetcode" Output: "letcod"
Note:
1 <= text.length <= 1000
text
consists of lowercase English letters.
// OJ: https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
string smallestSubsequence(string text) {
int cnts[26] = {0}, used[26] = {0};
for (char c : text) ++cnts[c - 'a'];
string ans;
for (char c : text) {
cnts[c - 'a']--;
if (used[c - 'a']) continue;
while (ans.size() && cnts[ans.back() - 'a'] && c < ans.back()) {
used[ans.back() - 'a'] = 0;
ans.pop_back();
}
ans.push_back(c);
used[c - 'a'] = 1;
}
return ans;
}
};