티스토리 뷰
Problem
You are given a string s. We want to partition the string into as many parts as possible so that each letter appears in at most one part.
Note that the partition is done so that after concatenating all the parts in order, the resultant string should be s.
Return a list of integers representing the size of these parts.
Example 1:
Input: s = "ababcbacadefegdehijhklij"
Output: [9,7,8]
Explanation:
The partition is "ababcbaca", "defegde", "hijhklij".
This is a partition so that each letter appears in at most one part.
A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits s into less parts.
Example 2:
Input: s = "eccbbbbdec"
Output: [10]
Constraints:
- 1 <= s.length <= 500
- s consists of lowercase English letters.
Solution
문자열이 주어졌을 때 각각의 문자가 최대한 많이 나타나도록 문자열을 분리하는 문제입니다.
import java.util.LinkedList;
import java.util.List;
public class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> result = new LinkedList<>();
char[] array = S.toCharArray();
int length = array.length;
int[] lastIndices = new int[26]; // (1)
for (int i = 0; i < length; i++) { // (2)
lastIndices[array[i] - 'a'] = i;
}
int max = lastIndices[array[0] - 'a'];
int s = 0;
for (int i = 0; i < length; i++) { // (3)
if (i == max) {
result.add(max - s + 1);
s = max + 1;
if (i + 1 < length) {
max = lastIndices[array[i + 1] - 'a'];
}
} else {
max = Math.max(lastIndices[array[i] - 'a'], max);
}
}
return result;
}
}
- 각 문자가 마지막으로 나타난 인덱스를 저장하기 위한 배열을 선언 및 초기화합니다.
- 주어진 문자열을 탐색하면서 각각의 알파벳에 해당하는 위치에 인덱스 값을 갱신합니다.
- 다시 문자열을 순차적으로 탐색하면서 max 값을 갱신하고, max값과 인덱스가 동일해졌을 때 결과 리스트에 해당 값을 추가합니다. 그리고 그 때까지의 길이를 따로 저장해두었다가 다음 분할지점이 왔을 때 계산에 사용합니다.
Test
package io.lcalmsky.leetcode.partition_labels;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import org.junit.jupiter.api.Test;
class SolutionTest {
@Test
void givenString_whenPartitionString_thenEachLetterAppearsMost() {
assertAll(
() -> test("ababcbacadefegdehijhklij", List.of(9, 7, 8)),
() -> test("eccbbbbdec", List.of(10))
);
}
private void test(String given, List<Integer> expected) {
// when
Solution solution = new Solution();
List<Integer> actual = solution.partitionLabels(given);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
1029. Two City Scheduling (0) | 2022.04.01 |
---|---|
1663. Smallest String With A Given Numeric Value (0) | 2022.03.30 |
1007. Minimum Domino Rotations For Equal Row (0) | 2022.03.25 |
799. Champagne Tower (0) | 2022.03.23 |
946. Validate Stack Sequences (0) | 2022.03.22 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 클린 아키텍처
- 함께 자라기
- 스프링 부트 애플리케이션
- proto3
- JSON
- gRPC
- 헥사고날 아키텍처
- Spring Boot JPA
- 스프링 부트
- QueryDSL
- Spring Boot
- Linux
- Jackson
- JPA
- @ManyToOne
- leetcode
- 스프링 부트 회원 가입
- 함께 자라기 후기
- spring boot jwt
- intellij
- 알고리즘
- Spring Data JPA
- Spring Boot Tutorial
- 스프링 데이터 jpa
- Java
- spring boot application
- spring boot app
- r
- 스프링 부트 튜토리얼
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함