문제 설명

※ 주의

본 문제는 일부러 시간복잡도가 오래 걸려도 정답이 나오도록 제한 시간이 넉넉하게 설정되어 있습니다. 본 문제를 정말 빠른 알고리즘으로 풀려면 구글에서 longest palindrom subsequence로 검색을 해보세요.


앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다. 문자열 s가 주어질 때, s의 부분문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요.

예를들면, 문자열 s가 abcdcba이면 7을 return하고 abacde이면 3을 return합니다.

제한사항
  • 문자열 s의 길이 : 2500 이하의 자연수
  • 문자열 s는 알파벳 소문자로만 구성

입출력 예
s answer
abcdcba 7
abacde 3
입출력 예 설명

입출력 예 #1 4번째자리 ‘d’를 기준으로 문자열 s 전체가 팰린드롬이 되므로 7을 return합니다.

입출력 예 #2 2번째자리 ‘b’를 기준으로 aba가 팰린드롬이 되므로 3을 return합니다.

나의 풀이

소스

def palindrom(string):
    if string == string[::-1]:
        return True
    else:
        return False


def get_substring_combination(origin_string, hope_length):
    result_arr = []

    for i in range(len(origin_string) - (hope_length - 1)):
        sub_string = origin_string[i:i + hope_length]
        result_arr.append(sub_string)

    return result_arr


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

    while s_length > 0:
        sub_s = get_substring_combination(s, s_length)

        for sub in sub_s:
            if palindrom(sub):
                return len(sub)

        s_length -= 1

    return answer

설명

가장 큰 단어부터 줄여가는 방식인데,

팰린드롬인지 체크하면서, 글자 수가 하나 줄은 단어의 조합을 구해간다.

그래서 팰린드롬이 되면 해당 길이 리턴.

긴 길이를 구하라고 하였으므로 단어에서부터 하나씩 줄여가는 방식 사용.

다른사람의 풀이

def is_palindrome(s, start, end):
    for i in range((end - start) // 2 + 1):
        if s[start + i] != s[end - i]:
            return False

    return True


def solution(s):
    for answer in range(len(s), 0, -1):
        start = 0
        end = answer - 1

        while end < len(s): 
            if is_palindrome(s, start, end):
                return answer
            start += 1
            end += 1

    return 1