가장 긴 팰린드롬 with 파이썬 본문
728x90
# 홀수만 가능
# 시간 초과오류
def solution(s):
answer = 0
n = len(s)
if n == 1:
return 1
# 가장 긴 길이부터 시작
s_len = n
while s_len > 1:
if n-s_len == 0:
v = s[:s_len]
if palindrome_check(v):
return s_len
else:
for i in range(n-s_len):
v = s[i:s_len+i]
if palindrome_check(v):
return s_len
s_len -= 1
return 1
def palindrome_check(v):
mid = (len(v)//2)
# 짝수 길이
if len(v)%2 == 0:
if v[0:mid] == v[-1:mid-1:-1]:
return True
else:
return False
# 홀수 길이
else:
if v[0:mid] == v[-1:mid:-1]:
return True
else:
return False
# 정답
def solution(s):
# substring길이: 길이 ~ 1
for i in range(len(s),0,-1):
# 시작점
for j in range(len(s)-i+1):
if s[j:j+i] == s[j:j+i][::-1]:
return i
# DP 활용
def solution(s):
longest_palindrome = 0
table = [[False for i in range(len(s))] for j in range(len(s))]
# 다음과 같은 방식으로 테이블을 만든다:
for i in range(len(s)):
for j in range(len(s)-i):
# len(substring) < 3 일 경우(다르게 표현하면, 두번째 대각선 줄을 만들 때까지)
# substring의 끝이 같을 경우 True를 넣고, longest_palindrome 을 업데이트 한다
if i < 2:
if s[j] == s[i+j]:
table[j][i+j] = True
longest_palindrome = i+1
else:
table[j][i+j] = False
# len(substring) > 3 일 경우
# substring의 끝이 같고, 왼쪽 밑 대각선 한칸에 있는 박스가 True면 True를 넣고, longest_palindrome을 업데이트 한다.
else:
if s[j] == s[i+j] and table[j+1][i+j-1]:
table[j][i+j] = True
longest_palindrome = i+1
else:
table[j][i+j] = False
return longest_palindrome
# 시간 초과
def solution(s):
return len(s) if s[::-1] == s else max(solution(s[:-1]), solution(s[1:]))
Comments