파이썬 알고리즘 인터뷰 6장 6번 가장 긴 팰린드롬 문자열 (리트코드 5번)

Kim Yongbin·2023년 8월 13일
0

코딩테스트

목록 보기
6/162

Problem

LeetCode - The World's Leading Online Programming Learning Platform

Given a string s, return the longest palindromic substring in s.

주어진 문자열에서 가장 긴 팰린드롬 문자열을 찾아라

Solution

일단, 이 문제는 못 풀었다. 내부에서 어떤 식으로 찾아야할지 감이 오지 않았다.

이 문제의 해법은 투 포인트를 사용한 슬라이딩 알고리즘이다.

Sliding Window 알고리즘

슬라이딩 윈도우 알고리즘은 고정된 사이즈의 윈도우를 좌 또는 우로 움직이면서 해당 범위에 있는 값들을 활용하여 연산을 하는 것이다. 공통된 부분은 유지하고 처음과 끝의 원소만 갱신하면서 유용하게 사용하는 것이다.

Two pointer 알고리즘

투 포인터 알고리즘의 경우 1차원 배열에 2개의 포인터를 조작하면서 연산을 처리하는 알고리즘이다. 완전 탐색으로 진행할 경우 시간초과가 되는 문제들의 시간 복잡도를 줄이는데 유용하다.

풀이

class Solution:
    @staticmethod
    def expand(left, right, s):
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        return s[left + 1: right]

    def longestPalindrome(self, s: str) -> str:
        if len(s) < 2 or s == s[::-1]:
            return s

        result = ""
        for i in range(len(s)):
            result = max(result, self.expand(i, i, s), self.expand(i, i+1, s), key=len)
        return result

이 문제의 경우 투 포인터를 활용하여 다이내믹하게 윈도우의 크기를 변화해가면서 palindrome를 확인한다.

  • longestPalindrome 함수에서는 시작점을 문자열 처음부터 끝까지 이동하면서 expand 함수를 실행한다.
  • expand 함수를 통해 two pointer를 양 옆으로 늘려가면서 palindrome을 확인한다.

추가적으로 Palindrome의 길이가 짝수일수도 있고, 홀수일 수도 있기 때문에 self.expand(i, i, s), self.expand(i, i+1, s) 두 가지 케이스를 모두 넣고 max값을 구한다.

결과

Reference

https://velog.io/@nana-moon/알고리즘-슬라이딩-윈도우Sliding-window-투-포인터Two-pointer

https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Algorithm/투포인터 알고리즘.md

profile
반박 시 여러분의 말이 맞습니다.

0개의 댓글