다이나믹 프로그래밍으로 풀 수 있는 전형적인 문제다.
여기서는 투포인터가 중앙을 중심으로 확장하는 형태로 풀이한다.
class Solution:
def longestPalindrome(self, s: str) -> str:
#팰린드롬 판별 및 투 포인터 확장
def expand(left: int, right: int) -> str:
while left >= 0 and right <=len(s) and s[left] == s[right -1]:
left -= 1
right += 1
return s[left + 1: right - 1]
#해당사항이 없을 때 빠르게 리턴
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
슬라이싱과 s[3]처럼 인덱스로 직접 조회하는 것은 숫자를 표기하는 방식이 다르므로 주의가 필요하다.
슬라이딩 윈도우가 문자열의 처음부터 끝까지 우측으로 이동한다.
2칸, 3칸으로 구성된 투 포인터가 슬라이딩 윈도우 처럼 계속 앞으로 전진해나간다. 이 때 윈도우에 들어온 문자열이 팰린드롬인 경우 그 자리에 멈추고, 투포인터가 점점 확장하는 식이다.
팰린드롬은 bb처럼 짝수 형태로 증가할 수 있고, bab처럼 홀수일 때도 있다.
따라서 짝수나 홀수 모든 경우에 대해 판별한다.