<--- 리트코드 316. Remove Duplicate Letters --->
# 문제: 중복된 문자를 제외하고 사전식 순서로 나열하라.
입력
"bcabc" |
출력
"abc" |
입력
"cbacdcbc |
출력
"acdb" |
# 풀이
1. 재귀를 이용한 분리
1
2
3
4
5
6
7
8
9
|
def remove_duplicate_letters(s):
for char in sorted(set(s)):
suffix = s[s.index(char):]
if set(s) == set(suffix):
return char + remove_duplicate_letters(suffix.replace(char, ''))
return ''
s = "bcabc"
print(remove_duplicate_letters(s))
|
cs |
2. 스택을 이용한 문자제거
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import collections
def remove_duplicate_letters(s):
counter, seen, stack = collections.Counter(s), set(), []
for char in s:
counter[char] -= 1
if char in seen:
continue
# 뒤에 붙일 문자가 남아 있다면 스택에서 제거
while stack and char < stack[-1] and counter[stack[-1]] > 0:
seen.remove(stack.pop())
stack.append(char)
seen.add(char)
return ''.join(stack)
s = "bcabc"
print(remove_duplicate_letters(s))
|
cs |
'Python' 카테고리의 다른 글
파이썬 알고리즘 인터뷰 - 23. 큐를 이용한 스택 구현 (0) | 2022.01.24 |
---|---|
파이썬 알고리즘 인터뷰 - 22. 일일 온도 (0) | 2022.01.23 |
파이썬 알고리즘 인터뷰 - 20. 유효한 괄호 (0) | 2022.01.22 |
파이썬 알고리즘 인터뷰 - 19. 역순 연결 리스트 Ⅱ (0) | 2022.01.22 |
파이썬 알고리즘 인터뷰 - 18. 홀짝 연결 리스트 (0) | 2022.01.22 |