https://leetcode.com/problems/remove-duplicate-letters/
중복된 문자를 지우고 사전식 순서로 나열하라.
상당히 난해한 문제이다. 그러나 스택으로 해결할 수 있다.
먼저 collections.counter 객체를 이용해서 각 알파벳의 출현 수를 구할 수 있다.
set() 자료형을 사용해서 중복되지 않게 자료들을 넣을 수 있다.
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
d=collections.Counter(s)
seen=set()
stack=[]
for letter in s:
d[letter] -=1
if letter in seen:
continue
while stack and stack[-1]>letter and d[stack[-1]]>0:
seen.remove(stack.pop())
stack.append(letter)
seen.add(letter)
return ''.join(stack)
이 문제의 핵심 부분은 while문 이다. 말로 설명하자면
stack이 존재하고,
현재 알파벳이 직전에 stack에 들어간 알파벳보다 선행하며,
직전에 들어간 알파벳이 뒤에도 출현하면(counter>0) pop으로 직전 알파벳을 지우는
알고리즘 이다.
'알고리즘 > 큐, 스택' 카테고리의 다른 글
14. 큐 (0) | 2021.08.30 |
---|---|
13. 스택 - 지금보다 큰 값은 언제 나타날까? (0) | 2021.08.27 |
11. 스택 - 유효한 괄호 (0) | 2021.08.26 |
10. 선형 자료 구조 - 스택 (0) | 2021.08.26 |
9. 선형자료구조 - 배열 (in, 성능 높이기) (0) | 2021.08.18 |