1public String removeDuplicateLetters(String s) {
2 Map<Character, Integer> freq = new HashMap<>();
3 for (char c : s.toCharArray()) {
4 freq.put(c, freq.getOrDefault(c, 0) + 1);
5 }
6
7 Stack<Character> stack = new Stack<>();
8 Set<Character> inStack = new HashSet<>();
9
10 for (int i = 0; i < s.length(); i++) {
11 char c = s.charAt(i);
12 freq.put(c, freq.get(c) - 1);
13
14 if (inStack.contains(c)) {
15 continue;
16 }
17
18 while (!stack.isEmpty() && stack.peek() > c && freq.get(stack.peek()) > 0) {
19 char removed = stack.pop();
20 inStack.remove(removed);
21 }
22
23 stack.push(c);
24 inStack.add(c);
25 }
26
27 StringBuilder result = new StringBuilder();
28 for (char c : stack) {
29 result.append(c);
30 }
31 return result.toString();
32}