763. Partition Labels
Der Aufgabentext wird für die gewählte Sprache aus dem Russischen übersetzt. Code bleibt unverändert.
: medium
Вам дана Zeichenkette s. Мы хотим разбить строку на как можно больше частей так, чтобы каждая буква встречалась не более чем в одной части. Обратите внимание, что разбиение выполняется так, чтобы после конкатенации всех частей по порядку получилась Zeichenkette s. return список целых чисел, представляющих размер этих частей.
Beispiel:
Input: s = "ababcbacadefegdehijhklij"
Output: [9,7,8]
C# Lösung
zugeordnet/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++ Lösung
Auto-Entwurf, vor dem Einreichen prüfen#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 Lösung
Auto-Entwurf, vor dem Einreichen prüfenimport 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 Lösung
zugeordnet/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 Lösung
zugeordnet/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⃣Когда текущая позиция совпадает с максимальной позицией, завершите часть и начните новую.
😎
Stellen zu dieser Aufgabe
aktive Stellen with overlapping task tags are angezeigt.
Es gibt noch keine aktiven Stellen.