1️⃣ 문제

문제 - 5. Longest Palindromic Substring

풀이 참조 - Youtube

2️⃣ 풀이 방법 및 코드

1️⃣ 로직

투 포인터 left, right를 이용하여 특정 인덱스에서 한칸씩 늘려서 회문(팰린드롬)인지 확인하는 방법

2️⃣ 소스 코드

입력으로 주어진 문자열(s)의 각 인덱스마다 expand() 함수에서 양 끝 포인터가 가리키는 두 문자가 서로 같을 때까지 늘려주어 최대 길이를 찾을 때마다 answer에 저장해준다.

class Solution {
    // 부분 문자열 확장하는 함수
    func expand(_ left: Int, _ right: Int, _ s: [String]) -> String {
        var newLeft = left
        var newRight = right
        while newLeft >= 0 && newRight < s.count && s[newLeft] == s[newRight] {
            newLeft -= 1
            newRight += 1
        }
        return s[newLeft + 1..<newRight].joined()
    }
    
    func longestPalindrome(_ s: String) -> String {
        var sArr = s.map { String($0) }
        var answer = ""
        
        if s.count < 2 || s == sArr.last! { return s }
        
        for i in 0..<s.count-1 {
            answer = [answer, expand(i, i, sArr), expand(i, i+1, sArr)].max { $0.count < $1.count }!
        }        
        return answer
    }
}

3️⃣ 이 문제를 풀면서 되새긴 점

max(by:)

image

Closure를 이용하여 원하는 max 기준에 충족하는 값 찾기

  • Optional이므로 ! 붙여주기
let hues = ["Heliotrope": 296, "Coral": 16, "Aquamarine": 156]
let greatestHue = hues.max { a, b in a.value < b.value }
print(greatestHue)
// Prints "Optional((key: "Heliotrope", value: 296))"