HackerRank Special String Again

x·2021년 5월 8일
0

problem-solving

목록 보기
18/18

주어진 문자열 s이 대해 만들 수 있는 팰린드롬(회문)의 수를 구하는 문제다
s의 길이가 100만까지이므로 모든 팰린드롬을 만들어서 세는 건 timeout날 것 같다
문자 하나하나를 돌면서 각 index에 대해 even_before, even_after, odd_before, odd_after를 만들고 index를 기준으로 좌우로 퍼져나가면서 팰린드롬의 개수를 센다

처음에는 하나의 while문에서 다 해결하려고 했으나 짝수(aaaa), 홀수(aaa)의 경우 팰린드롬이 만들어지는 경우가 다르고 종료 조건 또한 달라야 하므로 나누는 게 맞다

#!/bin/python3

import os


def substr_count(n: int, s: str) -> int:
    count = n
    for i in range(0, n):
        even_before = i
        even_after = i + 1
        odd_before = i - 1
        odd_after = i + 1

        count = count_palindromes(
            count=count,
            even_before=even_before,
            even_after=even_after,
            odd_before=odd_before,
            odd_after=odd_after,
            n=n,
            s=s,
        )

    return count


def count_palindromes(
    count: int,
    even_before: int,
    even_after: int,
    odd_before: int,
    odd_after: int,
    n: int,
    s: str,
) -> int:
    even_std = s[even_before]
    while even_before >= 0 and even_after <= n - 1:
        if s[even_before] == s[even_after] == even_std:
            count += 1
            even_before -= 1
            even_after += 1
        else:
            break

    odd_std = s[odd_before]
    while odd_before >= 0 and odd_after <= n - 1:
        if odd_std == s[odd_before] and odd_std == s[odd_after]:
            count += 1
            odd_before -= 1
            odd_after += 1
        else:
            break

    return count

if __name__ == "__main__":
    fptr = open(os.environ["OUTPUT_PATH"], "w")

    n = int(input())

    s = input()

    result = substr_count(n, s)

    fptr.write(str(result) + "\n")

    fptr.close()

0개의 댓글