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.
주어진 문자열 s중에서 모든 중복되는 문자를 제거하세요.
단, 결과는 사전순으로 가장 앞에 오는 값이여야 합니다.
Input: s = "bcabc"
Output: "abc"
Explanation: "(bc)abc" , 앞의 bc를 제거했다.
이번 풀이는 먼저 코드를 쓰고 해설하는 식으로 진행해 보겠다.
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
last: dict[str, int] = {v: i for i, v in enumerate(s)}
visited: set[str] = set()
stack: list[int] = []
for idx, ch in enumerate(s):
if ch not in visited:
while stack and ord(stack[-1]) > ord(ch) and last[stack[-1]] > idx:
visited.discard(stack[-1])
stack.pop()
stack.append(ch)
visited.add(ch)
return ''.join(stack)
last: dict[str, int] = {v: i for i, v in enumerate(s)}
visited: set[str] = set()
stack: list[int] = []
for idx, ch in enumerate(s):
if ch not in visited:
while stack and ord(stack[-1]) > ord(ch) and last[stack[-1]] > idx:
visited.discard(stack[-1])
stack.pop()
stack.append(ch)
visited.add(ch)