LeetCode : 763. Partition Labels(11/29:update)

1回目

function partitionLabels(s: string): number[] {

    let list: Map<string, { start: number, last: number }> = new Map<string, { start: number, last: number }>();
    const len: number = s.length;

    for (let i = 0; i < len; i++) {
        const c: string = s[i];

        if (list.has(c)) {
            list.set(c, { start: <number>list.get(c)?.start, last: i });
        } else {
            list.set(c, { start: i, last: i });
        }

    }

    let part: { start: number, last: number }[] = [];
    list.forEach((value: { start: number, last: number }, key: string) => {

        if (part.find(x => x.start < value.start && value.last < x.last)) {
            return true;
        }

        let index: number = part.findIndex(x => x.start < value.start && x.last < value.last && value.start < x.last && x.last < value.last);
        if (index > -1) {
            part[index].last = value.last;
        } else {
            part.push({ start: value.start, last: value.last });
        }


    });

    return part.map((value: { start: number, last: number }) => {
        return value.last - value.start + 1;
    });
};
  • 問題ページにあるヒントを見て作成。

  • とりあえず解答できて満足。

2回目

type indexOfS = { start: number, last: number };
function partitionLabels(s: string): number[] {

    let list: Map<string, indexOfS> = new Map<string, indexOfS>();

    for (let i = 0; i < s.length; i++) {
        const c: string = s[i];

        if (list.has(c)) {
            list.set(c, { start: list.get(c)!.start, last: i });
        } else {
            list.set(c, { start: i, last: i });
        }

    }

    let part: indexOfS[] = [];
    list.forEach((value: indexOfS, key: string) => {

        if (part.find(x => x.start < value.start && value.last < x.last)) {
            return true;
        }

        let index: number = part.findIndex(x => value.start < x.last && x.last < value.last);
        if (index > -1) {
            part[index].last = value.last;
        } else {
            part.push({ start: value.start, last: value.last });
        }

    });

    return part.map((value: indexOfS) => {
        return value.last - value.start + 1;
    });
};
  • マイベスト。

  • 何回も登場していた開始インデックス終了インデックスの型をTypeで宣言するように修正した。

  • findIndexの条件を見直した。

3回目

function partitionLabels(s: string): number[] {

    let list: Map<string, number> = new Map<string, number>();
    let arrayS: string[] = [];

    for (let i = 0; i < s.length; i++) {
        const c: string = s[i];
        list.set(c, i);
        arrayS.push(c);
    }

    let result: number[] = [];
    let length: number = 0;
    let index: number = 0;
    arrayS.forEach((c, i) => {

        length += 1;

        const cLastIndex: number = list.get(c)!;

        if (index < cLastIndex) {
            index = cLastIndex;
        }

        if (i === index) {
            result.push(length);
            length = 0;
        }
    });

    return result;
};
  • 解説動画を見て修正。

    • 文字の初登場インデックスは不要なので、マップには最後の登場インデックスのみを保持する。

    • 変数sのループ処理の時に1文字ごとの配列を作る。

  • 処理速度、使用メモリは2回目とあまり変わらなかった。

この記事が気に入ったらサポートをしてみませんか?