๋ฌธ์ ์ ๋ชฉ | ์ ๋ต๋ฅ | ๋์ด๋ |
316. remove_duplicate_letters | 45.2% | Medium |
Remove Duplicate Letters - LeetCode
Can you solve this real interview question? Remove Duplicate Letters - 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 re
leetcode.com
๋ฌธ์ ์์ฝ
๋ฌธ์์ด์ด ์ฃผ์ด์ง ๋ ์ค๋ณต ๋ฌธ์๋ฅผ ์ ๊ฑฐํ, ์ ์ผ ์์ ์ฌ์ ์ ์์๋ฅผ ์ง๋ ๋ฌธ์์ด์ ๋ฐํํด
์กฐ๊ฑด 1) ๋ฌธ์์ด์ ๊ธธ์ด๋ 1 ์ด์์ด๊ณ , ์๋ฌธ์๋ก๋ง ๊ตฌ์ฑ๋์ด ์๋ค.
์๊ฐํ๋ ํ์ด 0) ์ค๋ณต์ ์ ๊ฑฐํ๊ณ , ๋ฌธ์์ด์ ์์๋๋ก ์ถ๋ ฅ->set์ ์ด์ฉํด ์ค๋ณต์ ์ ๊ฑฐํ๊ณ , sort๋ฅผ ์ด์ฉํด ์์๋๋ก ์ถ๋ ฅ(์ค๋ต) : ๋ฌธ์์ด์ ์์๋๋ก ์ถ๋ ฅํ๋ผ๋ ๊ฒ์ด ์๋๋ผ,
the smallest in lexicographical order : ์ ์ผ ์์ ์ฌ์ ์ ์์๋ก
: unique ํ ๋ฌธ์์ด์ ๋ชจ๋ ํฌํจํ๊ณ , ๋๋จธ์ง ์ค๋ณต ์์์ ๋ํด ์ ์ผ ์์ ์ฌ์ ์ ์์๋ฅผ ๊ฐ์ง ๋ฌธ์๋ฅผ ๋ฐํํด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
์๊ฐํ๋ ํ์ด1) ์ ์ผ ์์ ๋ฌธ์์ด๋ถํฐ ์ฝ์ ํ๋ ๋ฐฉ๋ฒ -> ์ฌ๊ทํจ์ ์ด์ฉ
์๊ฐํ๋ ํ์ด2) ๋ฌธ์์ด ์์๋๋ก ํ๋์ฉ ํ๋จํ๋ ๋ฐฉ๋ฒ -> ์คํ ์ด์ฉ
ํ์ด 1
์ฌ๊ท ํจ์ ์ด์ฉ -> self. ํจ์๋ช (๋งค๊ฐ๋ณ์)
Step1. ์ ์ผ ์์ ๋ฌธ์์ด๋ถํฐ ํ๋จ
- ์ ์ผ ์์ ๋ฌธ์์ด๋ถํฐ ๋๊น์ง unique ํ ์์๊ฐ ๋ค ์์ผ๋ฉด, ํด๋น ๋ฌธ์์ด์ ๋ํด ๋ค์ ์ฌ์ ์ ์์์ธ์ง ํ๋จ
- ๋ค ์์ผ๋ฉด ๋ค์ ์์ ์์์ ๋ํด ์ฌ์ ์ ์์ ํ๋จ
iterable ๊ฐ์ฒด์ฌ์ด์ str์ ๋ถ์ฌ์ ๋ฐํํ๋ ํจ์ ex) 'X'.join('str') -> 'sXtXrX' ex) 'X'.join([a, b, c]) -> aXbXcX ์ฃผ๋ก ๋ฆฌ์คํธ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ ๋ ์ฌ์ฉ |
str.join(iterable) -> str ''.join(list) |
๋ฌธ์์ด์์ old ๋ฌธ์์ด์ new๋ฌธ์์ด๋ก ๋ณํํ๋ ํจ์ ex) 'abc'.replace('a', '') ->'bc' |
str.replace(old, new[, count])->str
|
์ฉ์ด์ ๋ฆฌ | |
์ ๋์ฌ : ๋ฑ๋ง ์์ ๋ถ์ด ๋ป์ ๋ํด์ค | prefix |
์ ๋ฏธ์ฌ : ๋ฑ๋ง ๋ค์ ๋ถ์ด ๋ป์ ๋ํด์ค | suffix |
๊ตฌํ (73ms)
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
# step1 : sorted(set(s)) - ์ ์ผ ์์ ๋ฌธ์์ด๋ถํฐ ํ๋จํ๊ธฐ ์ํด
for char in sorted(set(s)):
index=s.index(char)
suffix=s[index:]
if set(s)==set(suffix):
return char+self.removeDuplicateLetters(suffix.replace(char, ''))
return ''
ํ์ด 2
์คํ์ด์ฉ
Step1. ์ ์ผ ์์ ๋ฌธ์์ด๋ถํฐ ํ๋จ
- ํ์ฌ ๋ฌธ์๊ฐ ์คํ์ ์์ผ๋ฉด ๋ค์ ๋ฌธ์์ ๋ํด ํ๋จ
- ํ์ฌ ๋ฌธ์๊ฐ ์คํ์ ์์ผ๋ฉด -> ์์ ๋ฌธ์ ์ญ์ ์ฌ๋ถ ํ๋จ (์์ ๋ฌธ์๊ฐ ๋ค์ ๋ ์๊ณ , ํ์ฌ ๋ฌธ์๋ณด๋ค ํฌ๋ฉด ์ญ์ )
๋ฆฌ์คํธ์ ์งํฉ ์์ ์ถ๊ฐ ์ญ์ ํจ์ ์ ๋ฆฌ |
||
๋ฆฌ์คํธ | ์์ ์ถ๊ฐ | list.append(value) |
์์ ์ญ์ by index | del list(index) | |
์์ ์ญ์ by value | list.remove(value) | |
์ธํธ(์งํฉ) | ์์ ์ถ๊ฐ | set.add(value) |
์์ ์ญ์ - ์์ ์์ผ๋ฉด ์ค๋ฅ | set.remove(value) | |
์์ ์ญ์ - ์์ ์์ด๋ ์ค๋ฅ X | set.discard(value) |
๊ตฌํ 2
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
counter, stack, seen=collections.Counter(s), [], set()
for char in s:
counter[char]-=1
# ๋ง์ฝ ํด๋น ๋ฌธ์ ์์ stack ์ค ํด๋น ๋ฌธ์๋ณด๋ค ํฐ๋ฐ ๋ค์ ์๋ ๊ฒฝ์ฐ
if char in seen:
continue
while len(stack)!=0 and counter[stack[-1]]>0 and stack[-1]>char:
seen.remove(stack.pop()) # ๋ค์ stack[-1]๊ฐ ์๊ณ , ํ์ฌ ๋ฌธ์๋ณด๋ค stack[-1]๊ฐ์ด ํฐ ๊ฒฝ์ฐ
stack.append(char)
seen.add(char)
return ''.join(stack)
TIP
์ฌ๋ฌ ๋ณ์๋ฅผ ํ ๋ฒ์ ์ด๊ธฐํํ๋ฉด ์๊ฐ์ด ์ค์ด๋ ๋ค.
์งํฉ์ ์์์ ๊ด๊ณ์๊ณ , ๊ฐ์ ์ค๋ณต์ด ์๋ค.
'์๊ณ ๋ฆฌ์ฆ๐ฅ > ๋ฌธ์ ํ์ด (Python)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode] 232. implement_queue_using_stacks (Easy) 2023/5/10 (0) | 2023.05.10 |
---|---|
[LeetCode] 739. daily_temperatures (Medium) 2023/5/9 (0) | 2023.05.09 |
[LeetCode] 20. Valid_Parentheses (Easy) 2023/5/8 (0) | 2023.05.08 |
[LeetCode] 2. Add_Two_Numbers (Medium) 2023/5/5 (0) | 2023.05.05 |
[LeetCode] 206. Reverse_Linked_List (Easy) 2023/5/5 (0) | 2023.05.05 |