316. 去除重复字母

  1. class Solution {
  2. public String removeDuplicateLetters(String s) {
  3. int len = s.length();
  4. if (len == 0 || s.length() == 1)
  5. return s;
  6. Map<Character, Integer> map = new HashMap<>();
  7. Map<Character, Boolean> exit = new HashMap<>();
  8. for (int i = 0; i < len; i++) {
  9. Character c = s.charAt(i);
  10. map.put(c, map.getOrDefault(c, 0) + 1);
  11. exit.put(c, false);
  12. }
  13. Deque<Character> deque = new LinkedList<>();
  14. for (int i = 0; i < len; i++) {
  15. Character c = s.charAt(i);
  16. while (!deque.isEmpty() && exit.get(c) == false && deque.peekLast() > c && map.get(deque.peekLast()) > 1) {
  17. Character temp = deque.pollLast();
  18. map.put(temp, map.get(temp) - 1);
  19. exit.put(temp, false);
  20. }
  21. if (exit.get(c) == false) {
  22. deque.offerLast(c);
  23. exit.put(c, true);
  24. } else {
  25. map.put(c, map.get(c) - 1);
  26. }
  27. }
  28. StringBuilder ans = new StringBuilder();
  29. while (!deque.isEmpty()) {
  30. ans.append(deque.pollFirst());
  31. }
  32. return ans.toString();
  33. }
  34. }