가장 긴 팰린드롬 부분 문자열을 출력하라
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)
아이디어
- 문자열의 2번째 인덱스 (input[1]) 을 가운데로 생각하여 양옆을 비교하며 나간다.
- 양옆의 인덱스가 문자열 인덱스 밖을 가르키면 예외처리해준다
- 그렇게 만들어진 팰린드롬들의 길이로 비교하여 가장 긴 팰린드롬을 출력한다.
문제점
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 |