763. Partition Labels
El texto de la tarea se traduce del ruso para el idioma seleccionado. El código no cambia.
: medium
Вам дана cadena s. Мы хотим разбить строку на как можно больше частей так, чтобы каждая буква встречалась не более чем в одной части. Обратите внимание, что разбиение выполняется так, чтобы после конкатенации всех частей по порядку получилась cadena s. return список целых чисел, представляющих размер этих частей.
Ejemplo:
Input: s = "ababcbacadefegdehijhklij"
Output: [9,7,8]
C# solución
coincidente/originalusing 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++ solución
borrador automático, revisar antes de enviar#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 solución
borrador automático, revisar antes de enviarimport 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 solución
coincidente/originalfunction 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 solución
coincidente/originalpackage 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⃣Когда текущая позиция совпадает с максимальной позицией, завершите часть и начните новую.
😎
Vacantes para esta tarea
Se muestran vacantes activas con etiquetas coincidentes.
Todavía no hay vacantes activas.