본문 바로가기

가장 긴 팰린드롬 with 파이썬 본문

Algorithms/String

가장 긴 팰린드롬 with 파이썬

Louisus 2020. 8. 6. 15:38
728x90

# 홀수만 가능
# 시간 초과오류

def solution(s):
    answer = 0
    n = len(s)

    if n == 1:
        return 1
    # 가장 긴 길이부터 시작
    s_len = n

    while s_len > 1:
        if n-s_len == 0:
            v = s[:s_len]
            if palindrome_check(v):
                return s_len
        else:
            for i in range(n-s_len):
                v = s[i:s_len+i]
                if palindrome_check(v):
                    return s_len
            s_len -= 1
    return 1

def palindrome_check(v):
    mid = (len(v)//2)
    # 짝수 길이
    if len(v)%2 == 0:
        if v[0:mid] == v[-1:mid-1:-1]:
            return True
        else:
            return False
    # 홀수 길이
    else:
        if v[0:mid] == v[-1:mid:-1]:
            return True
        else:
            return False
# 정답
def solution(s):
        # substring길이: 길이 ~ 1
    for i in range(len(s),0,-1):
                # 시작점
        for j in range(len(s)-i+1):
            if s[j:j+i] == s[j:j+i][::-1]:
                return i
# DP 활용

def solution(s):
    longest_palindrome = 0
    table = [[False for i in range(len(s))] for j in range(len(s))]

    # 다음과 같은 방식으로 테이블을 만든다:
    for i in range(len(s)):
        for j in range(len(s)-i):
            # len(substring) < 3 일 경우(다르게 표현하면, 두번째 대각선 줄을 만들 때까지)
            # substring의 끝이 같을 경우 True를 넣고, longest_palindrome 을 업데이트 한다
            if i < 2:
                if s[j] == s[i+j]:
                    table[j][i+j] = True
                    longest_palindrome = i+1
                else:
                    table[j][i+j] = False
            # len(substring) > 3 일 경우
            # substring의 끝이 같고, 왼쪽 밑 대각선 한칸에 있는 박스가 True면 True를 넣고, longest_palindrome을 업데이트 한다.
            else:
                if s[j] == s[i+j] and table[j+1][i+j-1]:
                    table[j][i+j] = True
                    longest_palindrome = i+1                    
                else:
                    table[j][i+j] = False
    return longest_palindrome
# 시간 초과
def solution(s):
    return len(s) if s[::-1] == s else max(solution(s[:-1]), solution(s[1:]))
Comments