PS/LeetCode

[LeetCode] 459. Repeated Substring Pattern

Hamp 2024. 10. 15. 16:53
반응형

문제

https://leetcode.com/problems/repeated-substring-pattern/description/

입력

s: String = 문자

1 <= s.count <= 10,000

결과

ans: Bool = 반복 문자열 패턴인지  true / false

해석

 

일단 s.count 가 2보다 작으면 반복 문자열이 될 수 없으므로 false를 리턴 

 

1) 2s = s를 이어 붙힌 것

2) 2s에서  앞과 뒤를 제거한다. 

3) 이후 문자열에서 s를 찾을 수 있다면 반복가능한 문자열이다.

 

앞과 뒤를 제거한 이유는 원형 수열과 같이 연결해주기 위해서이다.

 

s = abaaba 라고 가정하고 위 과정을 진행해보자.

 

  1. 2s 만들기 
    •  2s = abaaba abaaba
  2. 앞뒤 제거
    • 최종 문자열 = baabaabaab
  3. 문자열 찾기
    •  baabaabaab 

 

길이 3으로 나누면 반복 가능한 문자열이라는 뜻과 같다.

 

코드

import Foundation 

extension String {
    subscript(_ index: Int) -> String {
        let startIndex = self.startIndex
        return String(self[self.index(startIndex, offsetBy: index)])
    } 

    subscript(_ range: Range<Int>) -> String {
        let startIndex = self.startIndex
        let from = self.index(startIndex, offsetBy: range.startIndex)
        let to = self.index(startIndex, offsetBy: range.endIndex)

        return String(self[from..<to])
    }
}
class Solution {
    
    func repeatedSubstringPattern(_ s: String) -> Bool {

        let l = s.count 
        let half = l / 2 

        if l < 2 {
            return false 
        }

        return (s[1..<l] + s[0..<l-1]).contains(s) 
    }
}

 

반응형