문제
Given a string s, check if it can be constructed by taking a substring of it and appending multiple copies of the substring together.
문자열이 주어지면, 그 문자열의 부분 문자열이 원본 문자열을 여러 개로 구성할 수 있는지 판별하여 true, false를 반환하시오.
예시
ample 1:
Input: s = "abab"
Output: true
Explanation: It is the substring "ab" twice.
Example 2:
Input: s = "aba"
Output: false
Example 3:
Input: s = "abcabcabcabc"
Output: true
Explanation: It is the substring "abc" four times or the substring "abcabc" twice.
제약 조건
Constraints:
- 1 <= s.length <= 104
- s consists of lowercase English letters.
해결 과정
- 우선 s 문자열의 길이가 2보다 작으면 false를 반환한다.
- pattern 문자열을 저장할 변수를 선언한다.
- for문을 순회한다. 이때, s 길이의 절반만 순회한다. 절반 이상을 순회하게 된다면, 그것은 더이상 pattern 문자열이 존재할 수 없기 때문이다. (pattern 문자열은 원본 문자열에 적어도 2번 이상 들어가야 하기 때문이다)
- pattern 문자열에 s[i] 문자를 추가한다.
- 이때, s 문자열에서 pattern 문자열을 삭제했을 때 반환되는 문자열이 빈 문자열이면 true를 반환한다. 이는 s 문자열이 pattern 문자열로 구성되어 있다는 뜻이다.
- for문을 순회한 후 빠져나오게 되면 false를 반환한다.
나의 코드는 시간복잡도가 높기 때문에, 더 빠르고 간단하게 풀 수 있는 풀이도 함께 첨부한다.
s 문자열을 두 번 반복한 후 맨 처음 문자와 마지막 문자를 제외한 후 그 안에 s가 존재하는지 판별하는 해결 코드이다.
해결 코드
/**
* @param {string} s
* @return {boolean}
*/
var repeatedSubstringPattern = function(s) {
if (s.length < 2) return false;
let pattern = '';
for (let i = 0; i < s.length / 2; i++) {
pattern += s[i];
if (!s.replaceAll(pattern, '')) return true;
}
return false;
};
더 빠른 코드
/**
* @param {string} s
* @return {boolean}
*/
var repeatedSubstringPattern = function(s) {
return s.repeat(2).slice(1, -1).includes(s);
};
'leetCode' 카테고리의 다른 글
[Easy] 66. Plus One (0) | 2022.06.13 |
---|---|
[Easy] 110. Balanced Binary Tree (0) | 2022.06.13 |
[Easy] 896. Monotonic Array (0) | 2022.06.09 |
[Easy] 28. Implement strStr() (0) | 2022.06.09 |
[Easy] 303. Range Sum Query - Immutable (0) | 2022.06.08 |
Comment