class Solution {
public String removeDuplicateLetters(String s) {
int len = s.length();
if (len == 0 || s.length() == 1)
return s;
Map<Character, Integer> map = new HashMap<>();
Map<Character, Boolean> exit = new HashMap<>();
for (int i = 0; i < len; i++) {
Character c = s.charAt(i);
map.put(c, map.getOrDefault(c, 0) + 1);
exit.put(c, false);
}
Deque<Character> deque = new LinkedList<>();
for (int i = 0; i < len; i++) {
Character c = s.charAt(i);
while (!deque.isEmpty() && exit.get(c) == false && deque.peekLast() > c && map.get(deque.peekLast()) > 1) {
Character temp = deque.pollLast();
map.put(temp, map.get(temp) - 1);
exit.put(temp, false);
}
if (exit.get(c) == false) {
deque.offerLast(c);
exit.put(c, true);
} else {
map.put(c, map.get(c) - 1);
}
}
StringBuilder ans = new StringBuilder();
while (!deque.isEmpty()) {
ans.append(deque.pollFirst());
}
return ans.toString();
}
}