Home Longest Palindromic Substring
Post
Cancel

Longest Palindromic Substring

Leetcode Problem

Longest Palindromic Substring

주어진 문자열에서 가장 긴 부분 palindrome 문자열을 구하는 문제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        if n < 2:
            return s
        start, max_len = 0, 1
        for i in range(n):
            odd = s[i - max_len - 1: i + 1]
            even = s[i - max_len: i + 1]
            if i - max_len - 1 >= 0 and odd == odd[::-1]:
                start = i - max_len - 1
                max_len += 2
            if i - max_len >= 0 and even == even[::-1]:
                start = i - max_len
                max_len += 1
        return s[start: start + max_len]

solution의 풀이입니다.
아이디어가 전혀 떠오르지 않았습니다.
palindrome의 짝수일 때와 홀수일 때 경우가 달라지는데, 짝수일 때의 변수와 홀수일 때의 변수를 따로 둘 생각을 하지 못했습니다.
odd, even 변수는 홀수일 때의 최댓값, 짝수일 때의 최댓값을 구하기 위한 변수가 아니라 max1, max2 변수라고 생각하시는 것이 이해하기에 더 편합니다. 왜냐하면 max_len = 1일 때, odd = s[0:1]이므로 2글자이기 때문입니다. odd와 even은 even == even[::-1]을 만족할 때마다 짝수 홀수가 바뀌게 됩니다.
for 문을 한 번 돌면서 palindrom을 만족하는 경우, odd == odd[::-1]일 때는 양 옆의 길이가 늘어나서 더 큰 palindrome을 만족하는지 검사하고, even == even[::-1]일 때는 짝수, 홀수에 대해 전부 만족하는지 검사하기 위해, start를 그대로 둡니다.
반복문을 한 번만 돌기 때문에 O(n)이고 성능 면에서 다른 풀이보다 월등합니다.





참고

This post is licensed under CC BY 4.0 by the author.