📖Problem: #917. reverse-only-letters
[LeetCode - The World's Leading Online Programming Learning Platform
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com](https://leetcode.com/problems/reverse-only-letters/description/)
- 작성일시: 2023년 10월 8일 오후 1:26
- 등급: Easy
- 유형: 스택/큐
문자열 s가 주어지면
- 영문자가 아니면 모두 같은 위치에 유지
- 영문자(소문자/대문자)는 모두 뒤집어야 함
🔍Institution
reverse하는 것을 보고 stack
이 바로 생각났다.
Flow:
s
길이만큼 for문을 반복하여stack
리스트를 생성하여, 입력s
에 대해 알파벳 값만 push시킨다.s
를 리스트형으로 변환한 값을StoList
리스트에 저장한다.StoList
길이만큼 for문을 반복하여 알파벳인 경우,알파벳이 아닌 경우 넘어간다.stack
의 값을 pop하여s
에 해당하는 인덱스의 값을 변경하고,StoList
를join()
함수를 이용하여 문자열 형태로 변경한 값을answer
에 저장한다.answer
를 return한다.
🔍Approach
- Stack
🚩My submission
class Solution:
def reverseOnlyLetters(self, s: str) -> str:
stack = []
for i in s:
if i.isalpha():
stack.append(i)
StoList = list(s)
for i in range(len(StoList)):
if StoList[i].isalpha():
StoList[i] = stack.pop()
answer = "".join(StoList)
return answer
🚩Others submission
Two-pointer approach
class Solution(object):
def reverseOnlyLetters(self, s):
"""
:type s: str
:rtype: str
"""
s = list(s)
left, right = 0, len(s)-1
while left < right:
if s[left].isalpha() and s[right].isalpha():
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
elif s[left].isalpha() and not s[right].isalpha():
right -=1
else:
left+=1
return ''.join(s)
- 문자열을 먼저 리스트 형태로 변환
- 양쪽 끝(
left
,right
)에 문자가 있는지 확인- 문자가 있다면,
index
를 이용해서 swapping
- 문자가 있다면,
- 마지막에 list를 다시 string으로 변환한 후 return
class Solution:
def reverseOnlyLetters(self, s: str) -> str:
alphabets = [i for i in s if i.isalpha()][-1::-1]
for i in range(len(s)):
if not(s[i].isalpha()):
alphabets.insert(i,s[i])
alphabets = ''.join(alphabets)
return alphabets
💡TIL
class Solution:
def reverseOnlyLetters(self, s: str) -> str:
stack = []
for i in s:
if i.isalpha():
stack.append(i)
for i in range(len(s)):
if s[i].isalpha():
s[i] = stack.pop()
이렇게 작성하면 아래와 같은 Runtime Error가 발생한다.
Runtime Error
TypeError: 'str' object does not support item assignment s[i] = stack.pop() Line 10 in reverseOnlyLetters (Solution.py) ret = Solution().reverseOnlyLetters(param_1) Line 31 in _driver (Solution.py) _driver() Line 42 in (Solution.py)
⇒ 즉, string을 list로 바꾸거나 replace()함수 사용해야 한다.
따라서 나는 list로 형변환을 시킨 후, 정답을 다시 string형태로 바꾸는 방식을 선택했다.
- string에 index로 접근할 수는 있지만 수정은 할 수 없다는 것을 배웠다.
- 문법
문자.isalpha()
: 문자가 알파벳인지 아닌지 True/False형태로 반환list()
: 리스트형태로 형변환“바꿀기호”.join(리스트이름)
: 파이썬 리스트를 문자열로 합치는 함수
a = ["a", "b", "c"]
"".join(a)
print(a)
# abc
# 요소 사이에 특정 문자열을 추가하여 문자열로 반환
a = ["a", "b", "c"]
"/".join(a)
print(a)
# a/b/c
반응형
'🧑💻Problem Solutions > LeetCode' 카테고리의 다른 글
[LeetCode] #101. Symmetric Tree (Python/파이썬) (2) | 2023.09.01 |
---|---|
[LeetCode] #70. Climbing Stairs (Python/파이썬) (0) | 2023.08.23 |
[LeetCode] #15. 3Sum (Python/파이썬) (5) | 2023.08.09 |
[LeetCode] 94. Binary Tree Inorder Traversal (Python) (0) | 2023.08.07 |
[LeetCode] #167. Two Sum 2 (Python) (0) | 2023.07.25 |