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(); }}