string removeDuplicateLetters(string s) {
string letters;
for (char ch : s) if (letters.find(ch) == string::npos) letters += ch;
vector<vector<int>> positions(letters.size());
for (int i = 0; i < (int)s.size(); i++) positions[letters.find(s[i])].push_back(i);
string best = "";
vector<int> chosen;
function<void(int)> pick = [&](int k) {
if (k == (int)letters.size()) {
vector<int> sorted(chosen); sort(sorted.begin(), sorted.end());
string candidate; for (int i : sorted) candidate += s[i];
if (best.empty() || candidate < best) best = candidate;
return;
}
for (int p : positions[k]) {
chosen.push_back(p);
pick(k + 1);
chosen.pop_back();
}
};
pick(0);
return best;
}
public String removeDuplicateLetters(String s) {
List<Character> letters = new ArrayList<>();
for (char ch : s.toCharArray()) if (!letters.contains(ch)) letters.add(ch);
List<List<Integer>> positions = new ArrayList<>();
for (int k = 0; k < letters.size(); k++) positions.add(new ArrayList<>());
for (int i = 0; i < s.length(); i++) positions.get(letters.indexOf(s.charAt(i))).add(i);
String[] best = {""};
int[] chosen = new int[letters.size()];
pick(0, s, positions, chosen, best);
return best[0];
}
private void pick(int k, String s, List<List<Integer>> positions, int[] chosen, String[] best) {
if (k == chosen.length) {
int[] sorted = chosen.clone(); Arrays.sort(sorted);
StringBuilder sb = new StringBuilder(); for (int i : sorted) sb.append(s.charAt(i));
String candidate = sb.toString();
if (best[0].isEmpty() || candidate.compareTo(best[0]) < 0) best[0] = candidate;
return;
}
for (int p : positions.get(k)) {
chosen[k] = p;
pick(k + 1, s, positions, chosen, best);
}
}
def remove_duplicate_letters(s):
letters = list(dict.fromkeys(s))
positions = [[i for i, ch in enumerate(s) if ch == l] for l in letters]
best = ['']
chosen = []
def pick(k):
if k == len(letters):
candidate = ''.join(s[i] for i in sorted(chosen))
if best[0] == '' or candidate < best[0]: best[0] = candidate
return
for p in positions[k]:
chosen.append(p)
pick(k + 1)
chosen.pop()
pick(0)
return best[0]
function removeDuplicateLetters(s: string): string {
const letters = [...new Set(s)];
const positions = letters.map((ch) => {
const p: number[] = [];
for (let i = 0; i < s.length; i++) if (s[i] === ch) p.push(i);
return p;
});
let best = '';
const chosen: number[] = [];
const pick = (k: number): void => {
if (k === letters.length) {
const candidate = [...chosen].sort((a, b) => a - b).map((i) => s[i]).join('');
if (best === '' || candidate < best) best = candidate;
return;
}
for (const p of positions[k]) {
chosen.push(p);
pick(k + 1);
chosen.pop();
}
};
pick(0);
return best;
}
string removeDuplicateLetters(string s) {
if (s.empty()) return "";
map<char, int> count;
for (char ch : s) count[ch]++;
int pos = 0;
for (int i = 0; i < (int)s.size(); i++) {
if (s[i] < s[pos]) pos = i;
count[s[i]]--;
if (count[s[i]] == 0) break;
}
string rest;
for (int i = pos + 1; i < (int)s.size(); i++) if (s[i] != s[pos]) rest += s[i];
return string(1, s[pos]) + removeDuplicateLetters(rest);
}
public String removeDuplicateLetters(String s) {
if (s.isEmpty()) return "";
int[] count = new int[128];
for (char ch : s.toCharArray()) count[ch]++;
int pos = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) < s.charAt(pos)) pos = i;
count[s.charAt(i)]--;
if (count[s.charAt(i)] == 0) break;
}
String rest = s.substring(pos + 1).replace(String.valueOf(s.charAt(pos)), "");
return s.charAt(pos) + removeDuplicateLetters(rest);
}
def remove_duplicate_letters(s):
if not s: return ''
count = Counter(s)
pos = 0
for i in range(len(s)):
if s[i] < s[pos]: pos = i
count[s[i]] -= 1
if count[s[i]] == 0: break
rest = s[pos + 1:].replace(s[pos], '')
return s[pos] + remove_duplicate_letters(rest)
function removeDuplicateLetters(s: string): string {
if (s.length === 0) return '';
const count = new Map<string, number>();
for (const ch of s) count.set(ch, (count.get(ch) ?? 0) + 1);
let pos = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] < s[pos]) pos = i;
count.set(s[i], count.get(s[i])! - 1);
if (count.get(s[i]) === 0) break;
}
const rest = s.slice(pos + 1).split(s[pos]).join('');
return s[pos] + removeDuplicateLetters(rest);
}
string removeDuplicateLetters(string s) {
unordered_map<char, int> last;
for (int i = 0; i < (int)s.size(); i++) last[s[i]] = i;
string stack;
unordered_set<char> inStack;
for (int i = 0; i < (int)s.size(); i++) {
char ch = s[i];
if (inStack.count(ch)) continue;
while (!stack.empty() && stack.back() > ch && last[stack.back()] > i) {
inStack.erase(stack.back()); stack.pop_back();
}
stack.push_back(ch);
inStack.insert(ch);
}
return stack;
}
public String removeDuplicateLetters(String s) {
Map<Character, Integer> last = new HashMap<>();
for (int i = 0; i < s.length(); i++) last.put(s.charAt(i), i);
StringBuilder stack = new StringBuilder();
Set<Character> inStack = new HashSet<>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (inStack.contains(ch)) continue;
while (stack.length() > 0 && stack.charAt(stack.length() - 1) > ch && last.get(stack.charAt(stack.length() - 1)) > i) {
inStack.remove(stack.charAt(stack.length() - 1)); stack.setLength(stack.length() - 1);
}
stack.append(ch);
inStack.add(ch);
}
return stack.toString();
}
def remove_duplicate_letters(s):
last = {}
for i, ch in enumerate(s): last[ch] = i
stack = []
in_stack = set()
for i, ch in enumerate(s):
if ch in in_stack: continue
while stack and stack[-1] > ch and last[stack[-1]] > i:
in_stack.discard(stack.pop())
stack.append(ch)
in_stack.add(ch)
return ''.join(stack)
function removeDuplicateLetters(s: string): string {
const last = new Map<string, number>();
for (let i = 0; i < s.length; i++) last.set(s[i], i);
const stack: string[] = [];
const inStack = new Set<string>();
for (let i = 0; i < s.length; i++) {
const ch = s[i];
if (inStack.has(ch)) continue;
while (stack.length > 0 && stack[stack.length - 1] > ch && last.get(stack[stack.length - 1])! > i) {
inStack.delete(stack.pop()!);
}
stack.push(ch);
inStack.add(ch);
}
return stack.join('');
}
string removeDuplicateLetters(string s) {
int last[26]; fill(last, last + 26, -1);
for (int i = 0; i < (int)s.size(); i++) last[s[i] - 'a'] = i;
vector<int> stack;
int inStack = 0;
for (int i = 0; i < (int)s.size(); i++) {
int c = s[i] - 'a';
if ((inStack >> c) & 1) continue;
while (!stack.empty() && stack.back() > c && last[stack.back()] > i) {
inStack &= ~(1 << stack.back()); stack.pop_back();
}
stack.push_back(c);
inStack |= 1 << c;
}
string result;
for (int c : stack) result += (char)('a' + c);
return result;
}
public String removeDuplicateLetters(String s) {
int[] last = new int[26]; Arrays.fill(last, -1);
for (int i = 0; i < s.length(); i++) last[s.charAt(i) - 'a'] = i;
int[] stack = new int[26]; int top = 0;
int inStack = 0;
for (int i = 0; i < s.length(); i++) {
int c = s.charAt(i) - 'a';
if (((inStack >> c) & 1) != 0) continue;
while (top > 0 && stack[top - 1] > c && last[stack[top - 1]] > i) {
inStack &= ~(1 << stack[--top]);
}
stack[top++] = c;
inStack |= 1 << c;
}
StringBuilder sb = new StringBuilder();
for (int k = 0; k < top; k++) sb.append((char) ('a' + stack[k]));
return sb.toString();
}
def remove_duplicate_letters(s):
last = [-1] * 26
for i, ch in enumerate(s): last[ord(ch) - 97] = i
stack = []
in_stack = 0
for i, ch in enumerate(s):
c = ord(ch) - 97
if (in_stack >> c) & 1: continue
while stack and stack[-1] > c and last[stack[-1]] > i:
in_stack &= ~(1 << stack.pop())
stack.append(c)
in_stack |= 1 << c
return ''.join(chr(c + 97) for c in stack)
function removeDuplicateLetters(s: string): string {
const last = new Array<number>(26).fill(-1);
for (let i = 0; i < s.length; i++) last[s.charCodeAt(i) - 97] = i;
const stack: number[] = [];
let inStack = 0;
for (let i = 0; i < s.length; i++) {
const c = s.charCodeAt(i) - 97;
if ((inStack >> c) & 1) continue;
while (stack.length > 0 && stack[stack.length - 1] > c && last[stack[stack.length - 1]] > i) {
inStack &= ~(1 << stack.pop()!);
}
stack.push(c);
inStack |= 1 << c;
}
return String.fromCharCode(...stack.map((c) => c + 97));
}