책읽기
[파이썬 알고리즘 인터뷰][문자열] 가장 긴 팰린드롬 부분 문자열
pythaac
2021. 7. 18. 18:59
이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다.
책에서 구현된 코드
def longestPalindrome(self, s:str) -> str:
def expand(left: int, right: int) -> str:
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return s[left+1:right]
if len(s) < 2 or s == s[::-1]:
return s
result = ''
for i in range(len(s)-1):
result = max(result, expand(i, i+1), expand(i, i+2), key=len)
return result
기억해야할 기법
- 슬라이딩 윈도우 방식
- 슬라이딩 윈도우 방식으로 전체탐색
- 예외처리
- 예외처리에서 s[::-1]를 추가할 생각을 못함
- 문제의 이해
- 무엇보다 중요한 것인데, 부분 팰린드롬임을 인지하지 못함
내가 구현한 코드
def longest_palindrome(s:str) -> str:
left, right = 0, len(s) - 1
start, length = 0, 1
results = []
if len(s) == 1:
return s
while left <= right:
if s[left] == s[right]:
length = length + 1
else:
results.append(s[start:start+length])
start, length = left+1, 1
left, right = left+1, right-1
if length > 1:
results.append(s[start:start + length])
return max(results, key=lambda x: len(x))
- 홀수일 경우, 가운데 값이 같을 때 로직
ex) "ccd"가 input일 경우
-> "cd"가 출력됨
1) 가운데에서 left와 right가 같다고 판단
2) length를 ++하고 while문을 마침
3) length > 1에서 "cd"를 append - left만 같은 char로 반복되는 case (부분 팰린드롬을 고려하지 않음)