본문 바로가기
알고리즘/항해99 스터디

99클럽 코테 스터디 30일차 TIL - 문자열 (LeetCode 5번)

2024. 6. 18.

항해99 코테 스터디 30일차 문제인 리트코드의 5번은 문자열에서 가장 긴 팰린드롬을 찾는 문제다. 난이도는 Medium이며 문자열 탐색을 통해 해결할 수 있다.

 

오늘의 문제 - XXX 문제 정보

문제 키워드

- 문자열

난이도

- Medium

 

문제 요약

  • 영어와 숫자로만 이루어진 길이 1000 이하의 문자열 s가 주어진다.
  • s의 substring 중 가장 긴 팰린드롬을 구하여라.

 

문제 풀이 과정  

  • 팰린드롬은 항상 홀수인 경우와 짝수인 경우의 계산이 달라 복잡하다. 따라서 두 경우를 나누어서 구하면 된다.
  • 기준점을 잡고 좌우로 한칸씩 늘려가면서 팰린드롬인지 확인한다. 이에 따라 가장 긴 팰린드롬의 길이와 위치를 갱신한다.

코드

class Solution {
public String longestPalindrome(String s) {
int n = s.length();
int startIdx = 0, longest = 1;
for(int mid = 1; mid < n; mid++) {
// 1. 홀수 팰린드롬
int oddMax = 0;
for(int dist = 1; mid-dist >= 0 && mid+dist < n; dist++) {
if (s.charAt(mid-dist) != s.charAt(mid+dist)) {
break;
}
oddMax++;
}
if (oddMax*2+1 > longest) {
startIdx = mid-oddMax;
longest = oddMax*2 + 1;
}
// 2. 짝수 팰린드롬
int evenMax = 0;
for(int dist = 1; mid-dist >= 0 && mid+dist <= n; dist++) {
if (s.charAt(mid-dist) != s.charAt(mid+dist-1)) {
break;
}
evenMax++;
}
if (evenMax*2 > longest) {
startIdx = mid-evenMax;
longest = evenMax*2;
}
}
return s.substring(startIdx, startIdx + longest);
}
}
  • 시간복잡도: O(n^2)
  • 공간복잡도: O(1)
728x90

댓글