763. Partition Labels
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.
: medium
Вам дана 문자열 s. Мы хотим разбить строку на как можно больше частей так, чтобы каждая буква встречалась не более чем в одной части. Обратите внимание, что разбиение выполняется так, чтобы после конкатенации всех частей по порядку получилась 문자열 s. return список целых чисел, представляющих размер этих частей.
예제:
Input: s = "ababcbacadefegdehijhklij"
Output: [9,7,8]
C# 해법
매칭됨/원본using System;
using System.Collections.Generic;
public class Solution {
public IList<int> PartitionLabels(string s) {
int[] lastPos = new int[26];
for (int i = 0; i < s.Length; i++) {
lastPos[s[i] - 'a'] = i;
}
List<int> partitions = new List<int>();
int j = 0, anchor = 0;
for (int i = 0; i < s.Length; i++) {
j = Math.Max(j, lastPos[s[i] - 'a']);
if (i == j) {
partitions.Add(i - anchor + 1);
anchor = i + 1;
}
}
return partitions;
}
}
C++ 해법
자동 초안, 제출 전 검토#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public vector<int> PartitionLabels(string s) {
vector<int>& lastPos = new int[26];
for (int i = 0; i < s.size(); i++) {
lastPos[s[i] - 'a'] = i;
}
List<int> partitions = new List<int>();
int j = 0, anchor = 0;
for (int i = 0; i < s.size(); i++) {
j = max(j, lastPos[s[i] - 'a']);
if (i == j) {
partitions.push_back(i - anchor + 1);
anchor = i + 1;
}
}
return partitions;
}
}
Java 해법
자동 초안, 제출 전 검토import java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
public List<int> PartitionLabels(String s) {
int[] lastPos = new int[26];
for (int i = 0; i < s.length; i++) {
lastPos[s[i] - 'a'] = i;
}
List<int> partitions = new List<int>();
int j = 0, anchor = 0;
for (int i = 0; i < s.length; i++) {
j = Math.max(j, lastPos[s[i] - 'a']);
if (i == j) {
partitions.add(i - anchor + 1);
anchor = i + 1;
}
}
return partitions;
}
}
JavaScript 해법
매칭됨/원본function partitionLabels(s) {
const lastPos = new Map();
for (let i = 0; i < s.length; i++) {
lastPos.set(s[i], i);
}
const partitions = [];
let j = 0, anchor = 0;
for (let i = 0; i < s.length; i++) {
j = Math.max(j, lastPos.get(s[i]));
if (i === j) {
partitions.push(i - anchor + 1);
anchor = i + 1;
}
}
return partitions;
Go 해법
매칭됨/원본package main
func partitionLabels(s string) []int {
lastPos := make(map[byte]int)
for i := 0; i < len(s); i++ {
lastPos[s[i]] = i
}
partitions := []int{}
j, anchor := 0, 0
for i := 0; i < len(s); i++ {
if lastPos[s[i]] > j {
j = lastPos[s[i]]
}
if i == j {
partitions = append(partitions, i-anchor+1)
anchor = i + 1
}
}
return partitions
}
Algorithm
1⃣Создайте словарь для хранения последней позиции каждой буквы в строке.
2⃣Пройдите по строке, отслеживая максимальную позицию текущей части.
3⃣Когда текущая позиция совпадает с максимальной позицией, завершите часть и начните новую.
😎
Vacancies for this task
활성 채용 with overlapping task tags are 표시됨.
아직 활성 채용이 없습니다.