Algorithm/LeetCode

[string] longest palindromic substring

sw_develop 2025. 1. 19. 13:26

✅ Problem

https://leetcode.com/problems/longest-palindromic-substring/description/

 

 Approach & Solution

방식)

더보기
  • 투 포인터 방식을 사용한다.
    • offset, limit 사용 (아래 코드에서 left가 offset, maxLen이 limit이 됨)
  • 팰린드롬이 될 수 있는 최소 길이(1 초과)의 값을 기준으로 양 옆으로 확장해나간다.
    • 최소 길이 : 2 or 3
    • ex) aa, aba
class Solution {
    
    int left, maxLen;

    public String longestPalindrome(String s) {
        // 문자 길이 저장
        int len = s.length();

        // 길이가 1인 경우 예외 처리
        if (len < 2) return s;

        // 우측으로 한 칸씩 이동하며 투 포인터 조사
        for (int i = 0; i < len - 1; i++) {
            extendPalindrome(s, i, i + 1); // 2칸짜리 투 포인터
            extendPalindrome(s, i, i + 2); // 3칸짜리 투 포인터
        }

        // 왼쪽과 최대 길이만큼을 더한 오른쪽만큼의 문자를 정답으로 리턴
        return s.substring(left, left + maxLen);
    }

    public void extendPalindrome(String s, int start, int end) {
        // 투 포인터가 유효한 범위 내에 있고 양쪽 끝 문자가 일치하는 팰린드롬인 경우 범위 확장
        while (start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end)) {
            start--;
            end++;
        }

        // 기존 최대 길이보다 큰 경우 값 교체
        if (maxLen < end - start - 1) {
            left = start + 1;
            maxLen = end - start - 1;
        }
    }
}

 

시간 복잡도

  • O(n^2)
    • extendPalindrome 메서드는 최대 O(n)이고, longestPalindrome 메서드에서 최대 2 * (n-1)번 호출됨