longestPalindrome

김_리트리버·2021년 3월 23일
0

[알고리즘]

목록 보기
27/47
# 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
profile
web-developer

0개의 댓글