# TODO
# 임의의 문자열에서 가장 긴 펠린드롬을 찾아라
# 펠린드롬? => 진용진 , 토마토 , 기러기, 토마마토, 진용용진
# 문자의 0번째 index char 와 마지막 index char 가 같고
# 1번째 index char 마지막 -1 char 가 같고
# ex> string = 토마마토
# string[0] = string[len(string)-1]
# string[1] = string[len(string)-2]
# 펠린드롬인지 검사할 때 굳이 외각에서 내부로 들어가며 검사할 필요가 있나?
# 내부에서 외부로 나가며 검사하도 되지 않나?
# string[1] = string[len(string)-2]
# string[0] = string[len(string)-1]
# 내부먼저 펠린드롬인지 확인하고 확인되면 외부로 넓혀나가는 함수를 만들어 놓고
# 전체 문자열의 index 를 변화시켜가며 가장 긴 펠린드롬으로 리턴값을 대체해 나가면 되겠다.
# 근데 펠린드롬이 토마토 같은 홀수길이도 있지만 토마마토 같은 짝수길이도 있다.
# index 를 변화시키는 것을 홀수, 짝수를 분리해서 각각 진행해야겠다.
class Solution:
def longestPalindrome(self, s: str) -> str:
def checkPalindrome(left: int, right: int) -> str:
# s[right-1] index 가 2칸씩 이동하는 경우 원래 문자열 index 를 초과하는 index 에 접근하게 되므로
# 이를 방지해주기 위해 right-1 을 해줌
while(left >= 0 and right <= len(s) and s[left] == s[right-1]):
left -= 1
right += 1
# left >= 0 and right <= len(s) and s[left] == s[right-1] 조건을 통과한 후
# left -= 1 right += 1 해버리면 펠린드롬 조건에 부합하지 않게 되버림
# 펠린드롬 조건에 부합한 index 로 초기화해서 리턴해줌
return s[left+1:right-1]
# 애초에 입력 문자열이 펠린드롬 이거나 길이가 1이면 그냥 입력값을 리턴
if(len(s) <= 1 or s == s[::-1]):
return s
result = ''
for i in range(len(s)-1):
result = max(result, checkPalindrome(i, i+1),
checkPalindrome(i, i+2), key=len)
return result