# 316. Remove Duplicate Letters

#### Medium

***

Given a string `s`, remove duplicate letters so that every letter appears once and only once. You must make sure your result is **the smallest in lexicographical order** among all possible results.

&#x20;

**Example 1:**

```
Input: s = "bcabc"
Output: "abc"
```

**Example 2:**

```
Input: s = "cbacdcbc"
Output: "acdb"
```

&#x20;

**Constraints:**

* `1 <= s.length <= 104`
* `s` consists of lowercase English letters.

&#x20;

**Note:** This question is the same as 1081: <https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/> \[**Same Solution**]

```python
class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        stack = []
        indexes = {}
        visited = set()
        for index, char in enumerate(list(s)):
            indexes[char] = index
        for index, char in enumerate(list(s)):
            if char not in visited:
                while stack and stack[-1] > char and index < indexes[stack[-1]]:
                    c = stack.pop()
                    visited.remove(c)
                stack.append(char)
                visited.add(char)
        return ''.join(stack)
```
