316.remove-duplicate-letters.go 510 B

1234567891011121314151617181920212223242526
  1. func removeDuplicateLetters(s string) string {
  2. cnt := make([]int, 256)
  3. for _, c := range s {
  4. cnt[c]++
  5. }
  6. set := make([]bool, 256)
  7. res := make([]rune, 0)
  8. tp := -1
  9. for _, c := range s {
  10. cnt[c]--
  11. if set[c] {
  12. continue
  13. }
  14. // If c is not in stack && stack is not empty && c less than top && top'll appear again, pop top
  15. for tp != -1 && c < res[tp] && 0 < cnt[res[tp]] {
  16. set[res[tp]] = false
  17. res = res[:tp]
  18. tp--
  19. }
  20. res = append(res, c)
  21. set[c] = true
  22. tp++
  23. }
  24. return string(res)
  25. }