본문 바로가기

항해99 chap02

가장 긴 펠린드롬 부분 문자열

가장 긴 팰린드롬 부분 문자열을 출력하라


def longestPalindrome(s):
    def expand(left,right):
        while left >=0 and right<len(s) and s[left] == s[right]:
            left-=1
            right+=1
        return s[left+1:right]

    if len(s)<2 or s == s[::-1]:
        return s

    result = ""

    for i in range(len(s)-1):
        result= max(result, expand(i,i+1),expand(i,i+2),key=len)
    return result

처음 풀이

input = "casacdasdsadc"

palin=""
tempp=""
for i in range(1,len(input)):

    cnt=0
    while True:
        temp = i #1

        left = temp-cnt # 0
        right = temp+cnt#2

        if left<0 or right>len(input)-1:
            left+=1
            right-=1
            tempp=input[left:right+1]
            if len(palin)<=len(tempp):
                palin=tempp

            break

        if (input[left] != input[right]):

            tempp=input[left+1:right]

            if len(palin)<=len(tempp):

                palin=tempp

            break

        cnt += 1 #cnt=2

print(palin)

아이디어

  1. 문자열의 2번째 인덱스 (input[1]) 을 가운데로 생각하여 양옆을 비교하며 나간다.
  2. 양옆의 인덱스가 문자열 인덱스 밖을 가르키면 예외처리해준다
  3. 그렇게 만들어진 팰린드롬들의 길이로 비교하여 가장 긴 팰린드롬을 출력한다.

문제점

1. 짝수 팰린드롬을 제외하고 생각하였다.

  • 예를 들어 SOS 라는 문자열의 가운데는 O이고 양옆이 S라서 내가 처음 짠 코드에서는 팰린드롬이라고 인식하지만, MOOM 의 경우 O 가 가운데가 되면 양옆이 M O가 되거나 O M이 되어 팰린드롬이라고 인식 못하게끔 코딩을 하였다.
  • 양옆에 두는 방식은 유지하되, 가운데를 하나 두고 하는 경우 가운데를 안두고 양옆으로 가는 경우 둘다 비교해주어 해결.

배운것

max() 함수에서 key=len을 인자로 주게되면 비교하는 값들중 길이가 가장 긴값을 리턴해준다.

'항해99 chap02' 카테고리의 다른 글

홀짝 연결 리스트  (0) 2022.01.18
역순 연결 리스트  (0) 2022.01.18
두 정렬 리스트의 병합  (0) 2022.01.18
배열 파티션  (0) 2022.01.18
그룹 애너그램  (0) 2022.01.18