763. Partition Labels

Le texte du problème est traduit du russe pour la langue sélectionnée. Le code reste inchangé.

: medium

Вам дана chaîne s. Мы хотим разбить строку на как можно больше частей так, чтобы каждая буква встречалась не более чем в одной части. Обратите внимание, что разбиение выполняется так, чтобы после конкатенации всех частей по порядку получилась chaîne s. return список целых чисел, представляющих размер этих частей.

Exemple:

Input: s = "ababcbacadefegdehijhklij"

Output: [9,7,8]

C# solution

correspondant/original
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++ solution

brouillon automatique, à relire avant soumission
#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 solution

brouillon automatique, à relire avant soumission
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 solution

correspondant/original
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 solution

correspondant/original
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

offres actives with overlapping task tags are affichés.

Toutes les offres
Il n'y a pas encore d'offres actives.