소소한 컴퓨터 이야기

가장 긴 팰린드롬 부분 문자열

by Cori

문제

가장 긴 팰린드롬 부분 문자열을 출력하라

 

· 입출력 예 

s return
"babad" "bab"
"cbbd" "bb"

풀이

1. 중앙을 중심으로 확장하는 풀이

-> 이 문제는 다이나믹 프로그래밍으로도 풀 수 있지만, 이를 이용한 풀이는 직관적으로 이해하기 어렵고, 실행 속도가 늦다. 이에 투포인터가 중앙을 중심으로 확장하는 형태로 문제를 풀어보자.

def longestPalindrome(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

가장 먼저 리스트 슬라이싱을 이용한 예외 처리를 해줌으로써 전체적인 풀이 속도를 향상한다. 이후 슬라이딩 윈도우가 문자열 처음부터

끝까지 우측으로 이동하며, expand()로 정의한 중첩 함수에서 홀수 (i, i+2), 짝수 (i, i+1)의 투 포인터가 팰린드롬 여부를 판별하며 최대값을 구한다.


Info

1. max 함수를 사용할 때 key 값을 설정해주면, 대상이 문자열이라도 key 값을 기준으로 최댓값을 구할 수 있다.

'CS > Coding Test' 카테고리의 다른 글

유효한 괄호  (0) 2021.10.03
두 수의 합  (0) 2021.10.02
Hashing  (0) 2021.10.01
그룹 애너그램  (0) 2021.09.30
전화번호 목록  (0) 2021.09.29

블로그의 정보

코딩하는 오리

Cori

활동하기