주어진 문자열 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()